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