1d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
2d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea// LLDB C++ API Test: verify the event description as obtained by calling
3d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea// SBEvent::GetCStringFromEvent that is received by an
4d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea// SBListener object registered with a process with a breakpoint.
5d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
6d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include <atomic>
7d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include <iostream>
8d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include <string>
9d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include <thread>
10d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
11d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include "lldb-headers.h"
12d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
13d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea#include "common.h"
14d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
15d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleausing namespace lldb;
16d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleausing namespace std;
17d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
18d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea// listener thread control
19d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaextern atomic<bool> g_done;
20d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
21d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea// used by listener thread to communicate a successful process continue command
22d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea// back to the checking thread.
23d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
24d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleamultithreaded_queue<bool> g_process_started;
25d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
26d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaextern SBListener g_listener;
27d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
28d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleavoid listener_func() {
29d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  while (!g_done) {
30d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    SBEvent event;
31d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    bool got_event = g_listener.WaitForEvent(1, event);
32d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    if (got_event) {
33d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      if (!event.IsValid())
34d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        throw Exception("event is not valid in listener thread");
35d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
36d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      SBProcess process = SBProcess::GetProcessFromEvent(event);
37d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      if (process.GetState() == eStateStopped) {
38d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        SBError error = process.Continue();
39d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        if (!error.Success())
40d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea          throw Exception(string("Cannot continue process from listener thread: ")
41d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea                          + error.GetCString());
42d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        g_process_started.push(true);
43d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea      }
44d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    }
45d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  }
46d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea}
47d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
48d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleavoid check_listener(SBDebugger &dbg) {
49d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  bool got_message = false;
50d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  while (!got_message)
51d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    g_process_started.pop(5, got_message);
52d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea  g_done = true;
53d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea}
54