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