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