xref: /llvm-project/compiler-rt/test/tsan/libdispatch/dispatch_main.c (revision 13dace5d5d653ccc305d6547ba08efee6f673f22)
1 // Check that we don't crash when dispatch_main calls pthread_exit which
2 // quits the main thread.
3 
4 // RUN: %clang_tsan %s -o %t
5 // RUN: %run %t 2>&1 | FileCheck %s --implicit-check-not='ThreadSanitizer'
6 
7 #include <dispatch/dispatch.h>
8 
9 #include <stdio.h>
10 #include <stdlib.h>
11 
main()12 int main() {
13   fprintf(stderr,"Hello world");
14 
15   dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_SERIAL);
16 
17   dispatch_async(q, ^{
18     fprintf(stderr,"1");
19   });
20 
21   dispatch_async(q, ^{
22     fprintf(stderr,"2");
23   });
24 
25   dispatch_async(q, ^{
26     fprintf(stderr,"3");
27 
28     dispatch_async(dispatch_get_main_queue(), ^{
29       fprintf(stderr,"Done.");
30       sleep(1);
31       exit(0);
32     });
33   });
34 
35   dispatch_main();
36 }
37 
38 // CHECK: Hello world
39 // CHECK: 123
40 // CHECK: Done.
41