|  | 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); | 
|  | } | 
|  | } |