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