// LLDB test snippet that registers a listener with a process that hits
// a breakpoint.

#include <atomic>
#include <iostream>
#include <string>
#include <thread>
#include <vector>

%include_SB_APIs%
#include "common.h"

using namespace lldb;
using namespace std;

void listener_func();
void check_listener(SBDebugger &dbg);

// Listener thread and related variables
atomic<bool> g_done; 
SBListener g_listener("test-listener");
thread g_listener_thread;

void shutdown_listener() {
  g_done.store(true);
  if (g_listener_thread.joinable())
    g_listener_thread.join();
}

void test(SBDebugger &dbg, std::vector<string> args) {
  try {
    g_done.store(false);
    SBTarget target = dbg.CreateTarget(args.at(0).c_str());
    if (!target.IsValid()) throw Exception("invalid target");

    SBBreakpoint breakpoint = target.BreakpointCreateByName("next");
    if (!breakpoint.IsValid()) throw Exception("invalid breakpoint");

    std::unique_ptr<char> working_dir(get_working_dir());

    SBError error;
    SBProcess process = target.Launch(g_listener,
                                      0, 0, 0, 0, 0,
                                      working_dir.get(),
                                      0,
                                      false,
                                      error);
    if (!error.Success())
      throw Exception("Error launching process.");

    /* FIXME: the approach below deadlocks
    SBProcess process = target.LaunchSimple (0, 0, working_dir.get());

    // get debugger listener (which is attached to process by default)
    g_listener = dbg.GetListener();
    */

    // FIXME: because a listener is attached to the process at launch-time,
    // registering the listener below results in two listeners being attached,
    // which is not supported by LLDB.
    // register listener
    // process.GetBroadcaster().AddListener(g_listener,
    //                                   SBProcess::eBroadcastBitStateChanged);

    // start listener thread
    g_listener_thread = thread(listener_func);
    check_listener(dbg);

  } catch (Exception &e) {
    shutdown_listener();
    throw e;
  }
  shutdown_listener();
}
