1import core.memory, core.thread, core.bitop;
2
3/*
4 * This test repeatedly performs operations on GC-allocated objects which
5 * are only reachable from TLS storage. Tests are performed in multiple threads
6 * and GC collections are triggered repeatedly, so if the GC does not properly
7 * scan TLS memory, this provokes a crash.
8 */
9class TestTLS
10{
11    uint a;
12    void addNumber()
13    {
14        auto val = volatileLoad(&a);
15        val++;
16        volatileStore(&a, val);
17    }
18}
19
20TestTLS tlsPtr;
21
22static this()
23{
24    tlsPtr = new TestTLS();
25}
26
27void main()
28{
29    void runThread()
30    {
31        for (size_t i = 0; i < 100; i++)
32        {
33            Thread.sleep(10.msecs);
34            tlsPtr.addNumber();
35            GC.collect();
36        }
37    }
38
39    Thread[] threads;
40    for (size_t i = 0; i < 20; i++)
41    {
42        auto t = new Thread(&runThread);
43        threads ~= t;
44        t.start();
45    }
46    runThread();
47
48    foreach (thread; threads)
49        thread.join();
50}
51