50 lines
1 KiB
D
50 lines
1 KiB
D
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);
|
|
}
|
|
}
|