Skip to content

Commit bec5cfd

Browse files
authored
[lldb-dap] Protect SetBreakpoint with the API mutex (#134030)
Protect the various SetBreakpoint functions with the API mutex. This fixes a race condition between the breakpoint being created and the DAP label getting added. This was causing `TestDAP_breakpointEvents.py` to be flaky. Fixes #131242.
1 parent 3801bf6 commit bec5cfd

File tree

5 files changed

+24
-0
lines changed

5 files changed

+24
-0
lines changed

lldb/tools/lldb-dap/Breakpoint.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "Breakpoint.h"
10+
#include "DAP.h"
1011
#include "JSONUtils.h"
1112
#include "lldb/API/SBAddress.h"
1213
#include "lldb/API/SBBreakpointLocation.h"
1314
#include "lldb/API/SBLineEntry.h"
15+
#include "lldb/API/SBMutex.h"
1416
#include "llvm/ADT/StringExtras.h"
1517
#include "llvm/Support/JSON.h"
1618
#include <cstddef>
1719
#include <cstdint>
20+
#include <mutex>
1821
#include <string>
1922

2023
using namespace lldb_dap;
@@ -74,6 +77,9 @@ bool Breakpoint::MatchesName(const char *name) {
7477
}
7578

7679
void Breakpoint::SetBreakpoint() {
80+
lldb::SBMutex lock = m_dap.GetAPIMutex();
81+
std::lock_guard<lldb::SBMutex> guard(lock);
82+
7783
m_bp.AddName(kDAPBreakpointLabel);
7884
if (!m_condition.empty())
7985
SetCondition();

lldb/tools/lldb-dap/DAP.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "lldb/API/SBFile.h"
2828
#include "lldb/API/SBFormat.h"
2929
#include "lldb/API/SBFrame.h"
30+
#include "lldb/API/SBMutex.h"
3031
#include "lldb/API/SBTarget.h"
3132
#include "lldb/API/SBThread.h"
3233
#include "lldb/API/SBValue.h"
@@ -404,6 +405,8 @@ struct DAP {
404405
InstructionBreakpoint *GetInstructionBreakpoint(const lldb::break_id_t bp_id);
405406

406407
InstructionBreakpoint *GetInstructionBPFromStopReason(lldb::SBThread &thread);
408+
409+
lldb::SBMutex GetAPIMutex() const { return target.GetAPIMutex(); }
407410
};
408411

409412
} // namespace lldb_dap

lldb/tools/lldb-dap/ExceptionBreakpoint.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,16 @@
99
#include "ExceptionBreakpoint.h"
1010
#include "BreakpointBase.h"
1111
#include "DAP.h"
12+
#include "lldb/API/SBMutex.h"
1213
#include "lldb/API/SBTarget.h"
14+
#include <mutex>
1315

1416
namespace lldb_dap {
1517

1618
void ExceptionBreakpoint::SetBreakpoint() {
19+
lldb::SBMutex lock = m_dap.GetAPIMutex();
20+
std::lock_guard<lldb::SBMutex> guard(lock);
21+
1722
if (m_bp.IsValid())
1823
return;
1924
bool catch_value = m_filter.find("_catch") != std::string::npos;

lldb/tools/lldb-dap/FunctionBreakpoint.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include "FunctionBreakpoint.h"
1010
#include "DAP.h"
1111
#include "JSONUtils.h"
12+
#include "lldb/API/SBMutex.h"
13+
#include <mutex>
1214

1315
namespace lldb_dap {
1416

@@ -17,6 +19,9 @@ FunctionBreakpoint::FunctionBreakpoint(DAP &d, const llvm::json::Object &obj)
1719
m_function_name(std::string(GetString(obj, "name").value_or(""))) {}
1820

1921
void FunctionBreakpoint::SetBreakpoint() {
22+
lldb::SBMutex lock = m_dap.GetAPIMutex();
23+
std::lock_guard<lldb::SBMutex> guard(lock);
24+
2025
if (m_function_name.empty())
2126
return;
2227
m_bp = m_dap.target.BreakpointCreateByName(m_function_name.c_str());

lldb/tools/lldb-dap/SourceBreakpoint.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@
1313
#include "lldb/API/SBBreakpoint.h"
1414
#include "lldb/API/SBFileSpecList.h"
1515
#include "lldb/API/SBFrame.h"
16+
#include "lldb/API/SBMutex.h"
1617
#include "lldb/API/SBTarget.h"
1718
#include "lldb/API/SBThread.h"
1819
#include "lldb/API/SBValue.h"
1920
#include "lldb/lldb-enumerations.h"
2021
#include <cassert>
2122
#include <cctype>
2223
#include <cstdlib>
24+
#include <mutex>
2325
#include <utility>
2426

2527
namespace lldb_dap {
@@ -33,6 +35,9 @@ SourceBreakpoint::SourceBreakpoint(DAP &dap, const llvm::json::Object &obj)
3335
.value_or(LLDB_INVALID_COLUMN_NUMBER)) {}
3436

3537
void SourceBreakpoint::SetBreakpoint(const llvm::StringRef source_path) {
38+
lldb::SBMutex lock = m_dap.GetAPIMutex();
39+
std::lock_guard<lldb::SBMutex> guard(lock);
40+
3641
lldb::SBFileSpecList module_list;
3742
m_bp = m_dap.target.BreakpointCreateByLocation(
3843
source_path.str().c_str(), m_line, m_column, 0, module_list);

0 commit comments

Comments
 (0)