xref: /llvm-project/lldb/test/API/functionalities/thread/create_after_attach/main.cpp (revision 99451b4453688a94c6014cac233d371ab4cc342d)
1*99451b44SJordan Rupprecht #include <stdio.h>
2*99451b44SJordan Rupprecht #include <chrono>
3*99451b44SJordan Rupprecht #include <thread>
4*99451b44SJordan Rupprecht 
5*99451b44SJordan Rupprecht using std::chrono::microseconds;
6*99451b44SJordan Rupprecht 
7*99451b44SJordan Rupprecht volatile int g_thread_2_continuing = 0;
8*99451b44SJordan Rupprecht 
9*99451b44SJordan Rupprecht void *
thread_1_func(void * input)10*99451b44SJordan Rupprecht thread_1_func (void *input)
11*99451b44SJordan Rupprecht {
12*99451b44SJordan Rupprecht     // Waiting to be released by the debugger.
13*99451b44SJordan Rupprecht     while (!g_thread_2_continuing) // Another thread will change this value
14*99451b44SJordan Rupprecht     {
15*99451b44SJordan Rupprecht         std::this_thread::sleep_for(microseconds(1));
16*99451b44SJordan Rupprecht     }
17*99451b44SJordan Rupprecht 
18*99451b44SJordan Rupprecht     // Return
19*99451b44SJordan Rupprecht     return NULL;  // Set third breakpoint here
20*99451b44SJordan Rupprecht }
21*99451b44SJordan Rupprecht 
22*99451b44SJordan Rupprecht void *
thread_2_func(void * input)23*99451b44SJordan Rupprecht thread_2_func (void *input)
24*99451b44SJordan Rupprecht {
25*99451b44SJordan Rupprecht     // Waiting to be released by the debugger.
26*99451b44SJordan Rupprecht     int child_thread_continue = 0;
27*99451b44SJordan Rupprecht     while (!child_thread_continue) // The debugger will change this value
28*99451b44SJordan Rupprecht     {
29*99451b44SJordan Rupprecht         std::this_thread::sleep_for(microseconds(1));  // Set second breakpoint here
30*99451b44SJordan Rupprecht     }
31*99451b44SJordan Rupprecht 
32*99451b44SJordan Rupprecht     // Release thread 1
33*99451b44SJordan Rupprecht     g_thread_2_continuing = 1;
34*99451b44SJordan Rupprecht 
35*99451b44SJordan Rupprecht     // Return
36*99451b44SJordan Rupprecht     return NULL;
37*99451b44SJordan Rupprecht }
38*99451b44SJordan Rupprecht 
main(int argc,char const * argv[])39*99451b44SJordan Rupprecht int main(int argc, char const *argv[])
40*99451b44SJordan Rupprecht {
41*99451b44SJordan Rupprecht     lldb_enable_attach();
42*99451b44SJordan Rupprecht 
43*99451b44SJordan Rupprecht     // Create a new thread
44*99451b44SJordan Rupprecht     std::thread thread_1(thread_1_func, nullptr);
45*99451b44SJordan Rupprecht 
46*99451b44SJordan Rupprecht     // Waiting to be attached by the debugger.
47*99451b44SJordan Rupprecht     int main_thread_continue = 0;
48*99451b44SJordan Rupprecht     while (!main_thread_continue) // The debugger will change this value
49*99451b44SJordan Rupprecht     {
50*99451b44SJordan Rupprecht         std::this_thread::sleep_for(microseconds(1));  // Set first breakpoint here
51*99451b44SJordan Rupprecht     }
52*99451b44SJordan Rupprecht 
53*99451b44SJordan Rupprecht     // Create another new thread
54*99451b44SJordan Rupprecht     std::thread thread_2(thread_2_func, nullptr);
55*99451b44SJordan Rupprecht 
56*99451b44SJordan Rupprecht     // Wait for the threads to finish.
57*99451b44SJordan Rupprecht     thread_1.join();
58*99451b44SJordan Rupprecht     thread_2.join();
59*99451b44SJordan Rupprecht 
60*99451b44SJordan Rupprecht     printf("Exiting now\n");
61*99451b44SJordan Rupprecht }
62