xref: /netbsd-src/external/gpl3/gcc/dist/libphobos/testsuite/libphobos.thread/external_threads.d (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 import core.sys.posix.pthread;
2 import core.memory;
3 import core.thread;
4 
5 extern (C) void  rt_moduleTlsCtor();
6 extern (C) void  rt_moduleTlsDtor();
7 
8 extern(C)
entry_point1(void *)9 void* entry_point1(void*)
10 {
11     // try collecting - GC must ignore this call because this thread
12     // is not registered in runtime
13     GC.collect();
14     return null;
15 }
16 
17 extern(C)
entry_point2(void *)18 void* entry_point2(void*)
19 {
20     // This thread gets registered in druntime, does some work and gets
21     // unregistered to be cleaned up manually
22     thread_attachThis();
23     rt_moduleTlsCtor();
24 
25     auto x = new int[10];
26 
27     rt_moduleTlsDtor();
28     thread_detachThis();
29     return null;
30 }
31 
main()32 void main()
33 {
34     // allocate some garbage
35     auto x = new int[1000];
36 
37     {
38         pthread_t thread;
39         auto status = pthread_create(&thread, null, &entry_point1, null);
40         assert(status == 0);
41         pthread_join(thread, null);
42     }
43 
44     {
45         pthread_t thread;
46         auto status = pthread_create(&thread, null, &entry_point2, null);
47         assert(status == 0);
48         pthread_join(thread, null);
49     }
50 }
51