| #include "pseudo_barrier.h" |
| #include <chrono> |
| #include <fcntl.h> |
| #include <fstream> |
| #include <stdio.h> |
| #include <thread> |
| #include <vector> |
| |
| pseudo_barrier_t barrier; |
| |
| constexpr size_t nthreads = 5; |
| volatile bool wait_for_debugger_flag = true; |
| |
| void break_here() {} |
| |
| void tfunc() { |
| pseudo_barrier_wait(barrier); |
| |
| break_here(); |
| } |
| |
| int main(int argc, char const *argv[]) { |
| lldb_enable_attach(); |
| |
| if (argc < 3) |
| return 1; |
| |
| // Create a file to signal that this process has started up. |
| std::ofstream(argv[1]).close(); |
| |
| // And wait for it to attach. |
| for (int i = 0; i < 100 && wait_for_debugger_flag; ++i) |
| std::this_thread::sleep_for(std::chrono::seconds(1)); |
| |
| // Fire up the threads and have them call break_here() simultaneously. |
| pseudo_barrier_init(barrier, nthreads); |
| std::vector<std::thread> threads; |
| for (size_t i = 0; i < nthreads; ++i) |
| threads.emplace_back(tfunc); |
| |
| for (std::thread &t : threads) |
| t.join(); |
| |
| // Create the file to let the debugger know we're running. |
| std::ofstream(argv[2]).close(); |
| |
| return 0; |
| } |