File tree Expand file tree Collapse file tree 2 files changed +32
-6
lines changed Expand file tree Collapse file tree 2 files changed +32
-6
lines changed Original file line number Diff line number Diff line change @@ -42,8 +42,10 @@ class Diagnostics {
42
42
void Report (llvm::StringRef message);
43
43
44
44
using Callback = std::function<llvm::Error(const FileSpec &)>;
45
+ using CallbackID = uint64_t ;
45
46
46
- void AddCallback (Callback callback);
47
+ CallbackID AddCallback (Callback callback);
48
+ void RemoveCallback (CallbackID id);
47
49
48
50
static Diagnostics &Instance ();
49
51
@@ -61,7 +63,21 @@ class Diagnostics {
61
63
62
64
RotatingLogHandler m_log_handler;
63
65
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.
65
81
std::mutex m_callbacks_mutex;
66
82
};
67
83
Original file line number Diff line number Diff line change @@ -43,9 +43,19 @@ Diagnostics::Diagnostics() : m_log_handler(g_num_log_messages) {}
43
43
44
44
Diagnostics::~Diagnostics () {}
45
45
46
- void Diagnostics::AddCallback (Callback callback) {
46
+ Diagnostics::CallbackID Diagnostics::AddCallback (Callback callback) {
47
47
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 ());
49
59
}
50
60
51
61
bool Diagnostics::Dump (raw_ostream &stream) {
@@ -84,8 +94,8 @@ Error Diagnostics::Create(const FileSpec &dir) {
84
94
if (Error err = DumpDiangosticsLog (dir))
85
95
return err;
86
96
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))
89
99
return err;
90
100
}
91
101
You can’t perform that action at this time.
0 commit comments