Skip to content

Commit 26e9f23

Browse files
committed
[lldb] Add the ability to remove diagnostic callbacks
Add the ability to remove diagnostic callbacks. This is necessary for diagnostics who's lifetime is tied to objects that can be destroyed. Differential revision: https://reviews.llvm.org/D143548
1 parent d6c3d79 commit 26e9f23

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

lldb/include/lldb/Utility/Diagnostics.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@ class Diagnostics {
4242
void Report(llvm::StringRef message);
4343

4444
using Callback = std::function<llvm::Error(const FileSpec &)>;
45+
using CallbackID = uint64_t;
4546

46-
void AddCallback(Callback callback);
47+
CallbackID AddCallback(Callback callback);
48+
void RemoveCallback(CallbackID id);
4749

4850
static Diagnostics &Instance();
4951

@@ -61,7 +63,21 @@ class Diagnostics {
6163

6264
RotatingLogHandler m_log_handler;
6365

64-
llvm::SmallVector<Callback, 4> m_callbacks;
66+
struct CallbackEntry {
67+
CallbackEntry(CallbackID id, Callback callback)
68+
: id(id), callback(std::move(callback)) {}
69+
CallbackID id;
70+
Callback callback;
71+
};
72+
73+
/// Monotonically increasing callback identifier. Unique per Diagnostic
74+
/// instance.
75+
CallbackID m_callback_id;
76+
77+
/// List of callback entries.
78+
llvm::SmallVector<CallbackEntry, 4> m_callbacks;
79+
80+
/// Mutex to protect callback list and callback identifier.
6581
std::mutex m_callbacks_mutex;
6682
};
6783

lldb/source/Utility/Diagnostics.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,19 @@ Diagnostics::Diagnostics() : m_log_handler(g_num_log_messages) {}
4343

4444
Diagnostics::~Diagnostics() {}
4545

46-
void Diagnostics::AddCallback(Callback callback) {
46+
Diagnostics::CallbackID Diagnostics::AddCallback(Callback callback) {
4747
std::lock_guard<std::mutex> guard(m_callbacks_mutex);
48-
m_callbacks.push_back(callback);
48+
CallbackID id = m_callback_id++;
49+
m_callbacks.emplace_back(id, callback);
50+
return id;
51+
}
52+
53+
void Diagnostics::RemoveCallback(CallbackID id) {
54+
std::lock_guard<std::mutex> guard(m_callbacks_mutex);
55+
m_callbacks.erase(
56+
std::remove_if(m_callbacks.begin(), m_callbacks.end(),
57+
[id](const CallbackEntry &e) { return e.id == id; }),
58+
m_callbacks.end());
4959
}
5060

5161
bool Diagnostics::Dump(raw_ostream &stream) {
@@ -84,8 +94,8 @@ Error Diagnostics::Create(const FileSpec &dir) {
8494
if (Error err = DumpDiangosticsLog(dir))
8595
return err;
8696

87-
for (Callback c : m_callbacks) {
88-
if (Error err = c(dir))
97+
for (CallbackEntry e : m_callbacks) {
98+
if (Error err = e.callback(dir))
8999
return err;
90100
}
91101

0 commit comments

Comments
 (0)