| // Multi-threaded test program for testing frame providers. | |
| #include <condition_variable> | |
| #include <iostream> | |
| #include <mutex> | |
| #include <thread> | |
| std::mutex mtx; | |
| std::condition_variable cv; | |
| int ready_count = 0; | |
| constexpr int NUM_THREADS = 2; | |
| int foo(int x) { | |
| int foo_local = x * 2; | |
| int foo_result = foo_local + 1; | |
| return foo_result; // Break in foo. | |
| } | |
| int bar(int x) { | |
| int bar_local = x * x; | |
| int bar_result = bar_local - 3; | |
| return bar_result; // Break in bar. | |
| } | |
| int baz(int x) { | |
| int baz_local = x + 7; | |
| int baz_result = baz_local / 2; | |
| return baz_result; // Break in baz. | |
| } | |
| void thread_func(int thread_num) { | |
| std::cout << "Thread " << thread_num << " started\n"; | |
| { | |
| std::unique_lock<std::mutex> lock(mtx); | |
| ready_count++; | |
| if (ready_count == NUM_THREADS + 1) { | |
| cv.notify_all(); | |
| } else { | |
| cv.wait(lock, [] { return ready_count == NUM_THREADS + 1; }); | |
| } | |
| } | |
| std::cout << "Thread " << thread_num << " at breakpoint\n"; // Break here. | |
| } | |
| int main(int argc, char **argv) { | |
| std::thread threads[NUM_THREADS]; | |
| // Used as an existing C++ variable we can anchor on. | |
| int variable_in_main = 123; | |
| (void)variable_in_main; // Breakpoint for variable tests. | |
| // Call foo for first breakpoint. | |
| int result_foo = foo(10); | |
| (void)result_foo; | |
| for (int i = 0; i < NUM_THREADS; i++) { | |
| threads[i] = std::thread(thread_func, i); | |
| } | |
| { | |
| std::unique_lock<std::mutex> lock(mtx); | |
| ready_count++; | |
| if (ready_count == NUM_THREADS + 1) { | |
| cv.notify_all(); | |
| } else { | |
| cv.wait(lock, [] { return ready_count == NUM_THREADS + 1; }); | |
| } | |
| } | |
| std::cout << "Main thread at barrier\n"; | |
| // Call bar for second breakpoint. | |
| int result_bar = bar(5); | |
| (void)result_bar; | |
| // Call baz for third breakpoint. | |
| int result_baz = baz(11); | |
| (void)result_baz; | |
| for (int i = 0; i < NUM_THREADS; i++) | |
| threads[i].join(); | |
| std::cout << "All threads completed\n"; | |
| return 0; | |
| } |