#include "attach.h"
#include "pseudo_barrier.h"
#include <chrono>
#include <cstdio>
#include <fcntl.h>
#include <fstream>
#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;
}
