@@ -132,6 +132,7 @@ class ThreadPlanStackMap {
132
132
bool check_for_new = true );
133
133
134
134
void AddThread (Thread &thread) {
135
+ std::lock_guard<std::recursive_mutex> guard (m_stack_map_mutex);
135
136
lldb::tid_t tid = thread.GetID ();
136
137
// If we already have a ThreadPlanStack for this thread, use it.
137
138
if (m_plans_list.find (tid) != m_plans_list.end ())
@@ -143,6 +144,7 @@ class ThreadPlanStackMap {
143
144
}
144
145
145
146
bool RemoveTID (lldb::tid_t tid) {
147
+ std::lock_guard<std::recursive_mutex> guard (m_stack_map_mutex);
146
148
auto result = m_plans_list.find (tid);
147
149
if (result == m_plans_list.end ())
148
150
return false ;
@@ -165,6 +167,7 @@ class ThreadPlanStackMap {
165
167
}
166
168
167
169
ThreadPlanStack *Find (lldb::tid_t tid) {
170
+ std::lock_guard<std::recursive_mutex> guard (m_stack_map_mutex);
168
171
auto result = m_plans_list.find (tid);
169
172
if (result == m_plans_list.end ())
170
173
return nullptr ;
@@ -177,12 +180,14 @@ class ThreadPlanStackMap {
177
180
// / This is useful in situations like when a new Thread list is being
178
181
// / generated.
179
182
void ClearThreadCache () {
183
+ std::lock_guard<std::recursive_mutex> guard (m_stack_map_mutex);
180
184
for (auto &plan_list : m_plans_list)
181
185
plan_list.second ->ClearThreadCache ();
182
186
}
183
187
184
188
// rename to Reactivate?
185
189
void Activate (ThreadPlanStack &stack) {
190
+ std::lock_guard<std::recursive_mutex> guard (m_stack_map_mutex);
186
191
// Remove this from the detached plan list:
187
192
auto end = m_detached_plans.end ();
188
193
auto iter = std::find_if (m_detached_plans.begin (), end,
@@ -198,6 +203,7 @@ class ThreadPlanStackMap {
198
203
}
199
204
200
205
void ScanForDetachedPlanStacks () {
206
+ std::lock_guard<std::recursive_mutex> guard (m_stack_map_mutex);
201
207
llvm::SmallVector<lldb::tid_t , 2 > invalidated_tids;
202
208
for (auto &pair : m_plans_list)
203
209
if (pair.second ->GetTID () != pair.first )
@@ -217,10 +223,12 @@ class ThreadPlanStackMap {
217
223
// scheduled.
218
224
// The vector will never have null ThreadPlanStacks in it.
219
225
std::vector<ThreadPlanStack *> &GetDetachedPlanStacks () {
226
+ std::lock_guard<std::recursive_mutex> guard (m_stack_map_mutex);
220
227
return m_detached_plans;
221
228
}
222
229
223
230
void Clear () {
231
+ std::lock_guard<std::recursive_mutex> guard (m_stack_map_mutex);
224
232
for (auto &plan : m_plans_list)
225
233
plan.second ->ThreadDestroyed (nullptr );
226
234
m_plans_list.clear ();
@@ -255,6 +263,7 @@ class ThreadPlanStackMap {
255
263
PlansStore m_plans_up_container;
256
264
std::vector<ThreadPlanStack *> m_detached_plans;
257
265
266
+ mutable std::recursive_mutex m_stack_map_mutex;
258
267
using PlansList = std::unordered_map<lldb::tid_t , ThreadPlanStack *>;
259
268
PlansList m_plans_list;
260
269
};
0 commit comments