import core.memory, core.thread, core.bitop; /* * This test repeatedly performs operations on GC-allocated objects which * are only reachable from TLS storage. Tests are performed in multiple threads * and GC collections are triggered repeatedly, so if the GC does not properly * scan TLS memory, this provokes a crash. */ class TestTLS { uint a; void addNumber() { auto val = volatileLoad(&a); val++; volatileStore(&a, val); } } TestTLS tlsPtr; static this() { tlsPtr = new TestTLS(); } void main() { void runThread() { for (size_t i = 0; i < 100; i++) { Thread.sleep(10.msecs); tlsPtr.addNumber(); GC.collect(); } } Thread[] threads; for (size_t i = 0; i < 20; i++) { auto t = new Thread(&runThread); threads ~= t; t.start(); } runThread(); foreach (thread; threads) thread.join(); }