xref: /llvm-project/lldb/test/API/functionalities/thread/thread_exit/main.cpp (revision fdea9a4ec9b0d9585b8fe8a612686d9f44f40ddc)
1*99451b44SJordan Rupprecht // This test verifies the correct handling of child thread exits.
2*99451b44SJordan Rupprecht 
3*99451b44SJordan Rupprecht #include "pseudo_barrier.h"
4*99451b44SJordan Rupprecht #include <thread>
5*99451b44SJordan Rupprecht 
6*99451b44SJordan Rupprecht pseudo_barrier_t g_barrier1;
7*99451b44SJordan Rupprecht pseudo_barrier_t g_barrier2;
8*99451b44SJordan Rupprecht pseudo_barrier_t g_barrier3;
9*99451b44SJordan Rupprecht 
10*99451b44SJordan Rupprecht void *
thread1()11*99451b44SJordan Rupprecht thread1 ()
12*99451b44SJordan Rupprecht {
13*99451b44SJordan Rupprecht     // Synchronize with the main thread.
14*99451b44SJordan Rupprecht     pseudo_barrier_wait(g_barrier1);
15*99451b44SJordan Rupprecht 
16*99451b44SJordan Rupprecht     // Synchronize with the main thread and thread2.
17*99451b44SJordan Rupprecht     pseudo_barrier_wait(g_barrier2);
18*99451b44SJordan Rupprecht 
19*99451b44SJordan Rupprecht     // Return
20*99451b44SJordan Rupprecht     return NULL;                                      // Set second breakpoint here
21*99451b44SJordan Rupprecht }
22*99451b44SJordan Rupprecht 
23*99451b44SJordan Rupprecht void *
thread2()24*99451b44SJordan Rupprecht thread2 ()
25*99451b44SJordan Rupprecht {
26*99451b44SJordan Rupprecht     // Synchronize with thread1 and the main thread.
27*99451b44SJordan Rupprecht     pseudo_barrier_wait(g_barrier2);
28*99451b44SJordan Rupprecht 
29*99451b44SJordan Rupprecht     // Synchronize with the main thread.
30*99451b44SJordan Rupprecht     pseudo_barrier_wait(g_barrier3);
31*99451b44SJordan Rupprecht 
32*99451b44SJordan Rupprecht     // Return
33*99451b44SJordan Rupprecht     return NULL;
34*99451b44SJordan Rupprecht }
35*99451b44SJordan Rupprecht 
main()36*99451b44SJordan Rupprecht int main ()
37*99451b44SJordan Rupprecht {
38*99451b44SJordan Rupprecht     pseudo_barrier_init(g_barrier1, 2);
39*99451b44SJordan Rupprecht     pseudo_barrier_init(g_barrier2, 3);
40*99451b44SJordan Rupprecht     pseudo_barrier_init(g_barrier3, 2);
41*99451b44SJordan Rupprecht 
42*99451b44SJordan Rupprecht     // Create a thread.
43*99451b44SJordan Rupprecht     std::thread thread_1(thread1);
44*99451b44SJordan Rupprecht 
45*99451b44SJordan Rupprecht     // Wait for thread1 to start.
46*99451b44SJordan Rupprecht     pseudo_barrier_wait(g_barrier1);
47*99451b44SJordan Rupprecht 
48*99451b44SJordan Rupprecht     // Create another thread.
49*99451b44SJordan Rupprecht     std::thread thread_2(thread2);  // Set first breakpoint here
50*99451b44SJordan Rupprecht 
51*99451b44SJordan Rupprecht     // Wait for thread2 to start.
52*99451b44SJordan Rupprecht     pseudo_barrier_wait(g_barrier2);
53*99451b44SJordan Rupprecht 
54*99451b44SJordan Rupprecht     // Wait for the first thread to finish
55*99451b44SJordan Rupprecht     thread_1.join();
56*99451b44SJordan Rupprecht 
57*99451b44SJordan Rupprecht     // Synchronize with the remaining thread
58*99451b44SJordan Rupprecht     int dummy = 47;                   // Set third breakpoint here
59*99451b44SJordan Rupprecht     pseudo_barrier_wait(g_barrier3);
60*99451b44SJordan Rupprecht 
61*99451b44SJordan Rupprecht     // Wait for the second thread to finish
62*99451b44SJordan Rupprecht     thread_2.join();
63*99451b44SJordan Rupprecht 
64*99451b44SJordan Rupprecht     return 0;                                         // Set fourth breakpoint here
65*99451b44SJordan Rupprecht }
66