| import core.memory; | |
| import core.sys.posix.pthread : pthread_create, pthread_join; | |
| import core.sys.posix.sys.types : pthread_t; | |
| 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); | |
| } | |
| } |