import core.sys.posix.pthread; import core.memory; import core.thread; extern (C) void rt_moduleTlsCtor(); extern (C) void rt_moduleTlsDtor(); extern(C) void* entry_point1(void*) { // try collecting - GC must ignore this call because this thread // is not registered in runtime GC.collect(); return null; } extern(C) void* entry_point2(void*) { // This thread gets registered in druntime, does some work and gets // unregistered to be cleaned up manually thread_attachThis(); rt_moduleTlsCtor(); auto x = new int[10]; rt_moduleTlsDtor(); thread_detachThis(); return null; } void main() { // allocate some garbage auto x = new int[1000]; { pthread_t thread; auto status = pthread_create(&thread, null, &entry_point1, null); assert(status == 0); pthread_join(thread, null); } { pthread_t thread; auto status = pthread_create(&thread, null, &entry_point2, null); assert(status == 0); pthread_join(thread, null); } }