199451b44SJordan Rupprecht // This test is intended to create a situation in which two threads are stopped 299451b44SJordan Rupprecht // at a breakpoint and the debugger issues a step-out command. 399451b44SJordan Rupprecht 499451b44SJordan Rupprecht #include "pseudo_barrier.h" 599451b44SJordan Rupprecht #include <thread> 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht pseudo_barrier_t g_barrier; 899451b44SJordan Rupprecht 999451b44SJordan Rupprecht volatile int g_test = 0; 1099451b44SJordan Rupprecht step_out_of_here()1199451b44SJordan Rupprechtvoid step_out_of_here() { 1299451b44SJordan Rupprecht g_test += 5; // Set breakpoint here 1399451b44SJordan Rupprecht } 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht void * thread_func()1699451b44SJordan Rupprechtthread_func () 1799451b44SJordan Rupprecht { 1899451b44SJordan Rupprecht // Wait until both threads are running 1999451b44SJordan Rupprecht pseudo_barrier_wait(g_barrier); 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht // Do something 22*71c4da83SJim Ingham step_out_of_here(); // But we might still be here 2399451b44SJordan Rupprecht 2499451b44SJordan Rupprecht // Return 25ed2853d2SRaphael Isemann return NULL; // Expect to stop here after step-out. 2699451b44SJordan Rupprecht } 2799451b44SJordan Rupprecht main()2899451b44SJordan Rupprechtint main () 2999451b44SJordan Rupprecht { 3099451b44SJordan Rupprecht // Don't let either thread do anything until they're both ready. 3199451b44SJordan Rupprecht pseudo_barrier_init(g_barrier, 2); 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht // Create two threads 3499451b44SJordan Rupprecht std::thread thread_1(thread_func); 3599451b44SJordan Rupprecht std::thread thread_2(thread_func); 3699451b44SJordan Rupprecht 3799451b44SJordan Rupprecht // Wait for the threads to finish 3899451b44SJordan Rupprecht thread_1.join(); 3999451b44SJordan Rupprecht thread_2.join(); 4099451b44SJordan Rupprecht 4199451b44SJordan Rupprecht return 0; 4299451b44SJordan Rupprecht } 43