xref: /llvm-project/lldb/test/API/api/multithreaded/test_breakpoint_callback.cpp.template (revision 99451b4453688a94c6014cac233d371ab4cc342d)
1*99451b44SJordan Rupprecht
2*99451b44SJordan Rupprecht// LLDB C++ API Test: verify that the function registered with
3*99451b44SJordan Rupprecht// SBBreakpoint.SetCallback() is invoked when a breakpoint is hit.
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprecht#include <mutex>
6*99451b44SJordan Rupprecht#include <iostream>
7*99451b44SJordan Rupprecht#include <vector>
8*99451b44SJordan Rupprecht#include <string>
9*99451b44SJordan Rupprecht
10*99451b44SJordan Rupprecht%include_SB_APIs%
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprecht#include "common.h"
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprechtusing namespace std;
15*99451b44SJordan Rupprechtusing namespace lldb;
16*99451b44SJordan Rupprecht
17*99451b44SJordan Rupprechtmutex g_mutex;
18*99451b44SJordan Rupprechtcondition_variable g_condition;
19*99451b44SJordan Rupprechtint g_breakpoint_hit_count = 0;
20*99451b44SJordan Rupprecht
21*99451b44SJordan Rupprechtbool BPCallback (void *baton,
22*99451b44SJordan Rupprecht                 SBProcess &process,
23*99451b44SJordan Rupprecht                 SBThread &thread,
24*99451b44SJordan Rupprecht                 SBBreakpointLocation &location) {
25*99451b44SJordan Rupprecht  lock_guard<mutex> lock(g_mutex);
26*99451b44SJordan Rupprecht  g_breakpoint_hit_count += 1;
27*99451b44SJordan Rupprecht  g_condition.notify_all();
28*99451b44SJordan Rupprecht  return true;
29*99451b44SJordan Rupprecht}
30*99451b44SJordan Rupprecht
31*99451b44SJordan Rupprechtvoid test(SBDebugger &dbg, vector<string> args) {
32*99451b44SJordan Rupprecht  dbg.SetAsync(false);
33*99451b44SJordan Rupprecht  SBTarget target = dbg.CreateTarget(args.at(0).c_str());
34*99451b44SJordan Rupprecht  if (!target.IsValid()) throw Exception("invalid target");
35*99451b44SJordan Rupprecht
36*99451b44SJordan Rupprecht  SBBreakpoint breakpoint = target.BreakpointCreateByName("next");
37*99451b44SJordan Rupprecht  if (!breakpoint.IsValid()) throw Exception("invalid breakpoint");
38*99451b44SJordan Rupprecht  breakpoint.SetCallback(BPCallback, 0);
39*99451b44SJordan Rupprecht
40*99451b44SJordan Rupprecht  std::unique_ptr<char> working_dir(get_working_dir());
41*99451b44SJordan Rupprecht  SBProcess process = target.LaunchSimple (0, 0, working_dir.get());
42*99451b44SJordan Rupprecht
43*99451b44SJordan Rupprecht  {
44*99451b44SJordan Rupprecht    unique_lock<mutex> lock(g_mutex);
45*99451b44SJordan Rupprecht    g_condition.wait_for(lock, chrono::seconds(5));
46*99451b44SJordan Rupprecht    if (g_breakpoint_hit_count != 1)
47*99451b44SJordan Rupprecht      throw Exception("Breakpoint hit count expected to be 1");
48*99451b44SJordan Rupprecht  }
49*99451b44SJordan Rupprecht}
50