@@ -39,21 +39,21 @@ ThreadPlanStack::ThreadPlanStack(const Thread &thread, bool make_null) {
39
39
void ThreadPlanStack::DumpThreadPlans (Stream &s,
40
40
lldb::DescriptionLevel desc_level,
41
41
bool include_internal) const {
42
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
42
+ llvm::sys::ScopedReader guard (m_stack_mutex);
43
43
s.IndentMore ();
44
- PrintOneStack (s, " Active plan stack" , m_plans, desc_level, include_internal);
45
- PrintOneStack (s, " Completed plan stack" , m_completed_plans, desc_level,
46
- include_internal);
47
- PrintOneStack (s, " Discarded plan stack" , m_discarded_plans, desc_level,
48
- include_internal);
44
+ PrintOneStackNoLock (s, " Active plan stack" , m_plans, desc_level,
45
+ include_internal);
46
+ PrintOneStackNoLock (s, " Completed plan stack" , m_completed_plans, desc_level,
47
+ include_internal);
48
+ PrintOneStackNoLock (s, " Discarded plan stack" , m_discarded_plans, desc_level,
49
+ include_internal);
49
50
s.IndentLess ();
50
51
}
51
52
52
- void ThreadPlanStack::PrintOneStack (Stream &s, llvm::StringRef stack_name,
53
- const PlanStack &stack,
54
- lldb::DescriptionLevel desc_level,
55
- bool include_internal) const {
56
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
53
+ void ThreadPlanStack::PrintOneStackNoLock (Stream &s, llvm::StringRef stack_name,
54
+ const PlanStack &stack,
55
+ lldb::DescriptionLevel desc_level,
56
+ bool include_internal) const {
57
57
// If the stack is empty, just exit:
58
58
if (stack.empty ())
59
59
return ;
@@ -82,15 +82,15 @@ void ThreadPlanStack::PrintOneStack(Stream &s, llvm::StringRef stack_name,
82
82
}
83
83
84
84
size_t ThreadPlanStack::CheckpointCompletedPlans () {
85
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
85
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
86
86
m_completed_plan_checkpoint++;
87
87
m_completed_plan_store.insert (
88
88
std::make_pair (m_completed_plan_checkpoint, m_completed_plans));
89
89
return m_completed_plan_checkpoint;
90
90
}
91
91
92
92
void ThreadPlanStack::RestoreCompletedPlanCheckpoint (size_t checkpoint) {
93
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
93
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
94
94
auto result = m_completed_plan_store.find (checkpoint);
95
95
assert (result != m_completed_plan_store.end () &&
96
96
" Asked for a checkpoint that didn't exist" );
@@ -99,13 +99,13 @@ void ThreadPlanStack::RestoreCompletedPlanCheckpoint(size_t checkpoint) {
99
99
}
100
100
101
101
void ThreadPlanStack::DiscardCompletedPlanCheckpoint (size_t checkpoint) {
102
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
102
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
103
103
m_completed_plan_store.erase (checkpoint);
104
104
}
105
105
106
106
void ThreadPlanStack::ThreadDestroyed (Thread *thread) {
107
107
// Tell the plan stacks that this thread is going away:
108
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
108
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
109
109
for (ThreadPlanSP plan : m_plans)
110
110
plan->ThreadDestroyed ();
111
111
@@ -134,20 +134,22 @@ void ThreadPlanStack::PushPlan(lldb::ThreadPlanSP new_plan_sp) {
134
134
// If the thread plan doesn't already have a tracer, give it its parent's
135
135
// tracer:
136
136
// The first plan has to be a base plan:
137
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
138
- assert ((m_plans.size () > 0 || new_plan_sp->IsBasePlan ()) &&
139
- " Zeroth plan must be a base plan" );
140
-
141
- if (!new_plan_sp->GetThreadPlanTracer ()) {
142
- assert (!m_plans.empty ());
143
- new_plan_sp->SetThreadPlanTracer (m_plans.back ()->GetThreadPlanTracer ());
137
+ { // Scope for Lock - DidPush often adds plans to the stack:
138
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
139
+ assert ((m_plans.size () > 0 || new_plan_sp->IsBasePlan ()) &&
140
+ " Zeroth plan must be a base plan" );
141
+
142
+ if (!new_plan_sp->GetThreadPlanTracer ()) {
143
+ assert (!m_plans.empty ());
144
+ new_plan_sp->SetThreadPlanTracer (m_plans.back ()->GetThreadPlanTracer ());
145
+ }
146
+ m_plans.push_back (new_plan_sp);
144
147
}
145
- m_plans.push_back (new_plan_sp);
146
148
new_plan_sp->DidPush ();
147
149
}
148
150
149
151
lldb::ThreadPlanSP ThreadPlanStack::PopPlan () {
150
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
152
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
151
153
assert (m_plans.size () > 1 && " Can't pop the base thread plan" );
152
154
153
155
// Note that moving the top element of the vector would leave it in an
@@ -161,7 +163,11 @@ lldb::ThreadPlanSP ThreadPlanStack::PopPlan() {
161
163
}
162
164
163
165
lldb::ThreadPlanSP ThreadPlanStack::DiscardPlan () {
164
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
166
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
167
+ return DiscardPlanNoLock ();
168
+ }
169
+
170
+ lldb::ThreadPlanSP ThreadPlanStack::DiscardPlanNoLock () {
165
171
assert (m_plans.size () > 1 && " Can't discard the base thread plan" );
166
172
167
173
// Note that moving the top element of the vector would leave it in an
@@ -177,12 +183,12 @@ lldb::ThreadPlanSP ThreadPlanStack::DiscardPlan() {
177
183
// If the input plan is nullptr, discard all plans. Otherwise make sure this
178
184
// plan is in the stack, and if so discard up to and including it.
179
185
void ThreadPlanStack::DiscardPlansUpToPlan (ThreadPlan *up_to_plan_ptr) {
180
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
186
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
181
187
int stack_size = m_plans.size ();
182
188
183
189
if (up_to_plan_ptr == nullptr ) {
184
190
for (int i = stack_size - 1 ; i > 0 ; i--)
185
- DiscardPlan ();
191
+ DiscardPlanNoLock ();
186
192
return ;
187
193
}
188
194
@@ -197,23 +203,23 @@ void ThreadPlanStack::DiscardPlansUpToPlan(ThreadPlan *up_to_plan_ptr) {
197
203
if (found_it) {
198
204
bool last_one = false ;
199
205
for (int i = stack_size - 1 ; i > 0 && !last_one; i--) {
200
- if (GetCurrentPlan ().get () == up_to_plan_ptr)
206
+ if (GetCurrentPlanNoLock ().get () == up_to_plan_ptr)
201
207
last_one = true ;
202
- DiscardPlan ();
208
+ DiscardPlanNoLock ();
203
209
}
204
210
}
205
211
}
206
212
207
213
void ThreadPlanStack::DiscardAllPlans () {
208
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
214
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
209
215
int stack_size = m_plans.size ();
210
216
for (int i = stack_size - 1 ; i > 0 ; i--) {
211
- DiscardPlan ();
217
+ DiscardPlanNoLock ();
212
218
}
213
219
}
214
220
215
221
void ThreadPlanStack::DiscardConsultingControllingPlans () {
216
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
222
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
217
223
while (true ) {
218
224
int controlling_plan_idx;
219
225
bool discard = true ;
@@ -234,26 +240,30 @@ void ThreadPlanStack::DiscardConsultingControllingPlans() {
234
240
235
241
// First pop all the dependent plans:
236
242
for (int i = m_plans.size () - 1 ; i > controlling_plan_idx; i--) {
237
- DiscardPlan ();
243
+ DiscardPlanNoLock ();
238
244
}
239
245
240
246
// Now discard the controlling plan itself.
241
247
// The bottom-most plan never gets discarded. "OkayToDiscard" for it
242
248
// means discard it's dependent plans, but not it...
243
249
if (controlling_plan_idx > 0 ) {
244
- DiscardPlan ();
250
+ DiscardPlanNoLock ();
245
251
}
246
252
}
247
253
}
248
254
249
255
lldb::ThreadPlanSP ThreadPlanStack::GetCurrentPlan () const {
250
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
256
+ llvm::sys::ScopedReader guard (m_stack_mutex);
257
+ return GetCurrentPlanNoLock ();
258
+ }
259
+
260
+ lldb::ThreadPlanSP ThreadPlanStack::GetCurrentPlanNoLock () const {
251
261
assert (m_plans.size () != 0 && " There will always be a base plan." );
252
262
return m_plans.back ();
253
263
}
254
264
255
265
lldb::ThreadPlanSP ThreadPlanStack::GetCompletedPlan (bool skip_private) const {
256
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
266
+ llvm::sys::ScopedReader guard (m_stack_mutex);
257
267
if (m_completed_plans.empty ())
258
268
return {};
259
269
@@ -271,7 +281,7 @@ lldb::ThreadPlanSP ThreadPlanStack::GetCompletedPlan(bool skip_private) const {
271
281
272
282
lldb::ThreadPlanSP ThreadPlanStack::GetPlanByIndex (uint32_t plan_idx,
273
283
bool skip_private) const {
274
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
284
+ llvm::sys::ScopedReader guard (m_stack_mutex);
275
285
uint32_t idx = 0 ;
276
286
277
287
for (lldb::ThreadPlanSP plan_sp : m_plans) {
@@ -285,7 +295,7 @@ lldb::ThreadPlanSP ThreadPlanStack::GetPlanByIndex(uint32_t plan_idx,
285
295
}
286
296
287
297
lldb::ValueObjectSP ThreadPlanStack::GetReturnValueObject () const {
288
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
298
+ llvm::sys::ScopedReader guard (m_stack_mutex);
289
299
if (m_completed_plans.empty ())
290
300
return {};
291
301
@@ -299,7 +309,7 @@ lldb::ValueObjectSP ThreadPlanStack::GetReturnValueObject() const {
299
309
}
300
310
301
311
lldb::ExpressionVariableSP ThreadPlanStack::GetExpressionVariable () const {
302
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
312
+ llvm::sys::ScopedReader guard (m_stack_mutex);
303
313
if (m_completed_plans.empty ())
304
314
return {};
305
315
@@ -312,23 +322,23 @@ lldb::ExpressionVariableSP ThreadPlanStack::GetExpressionVariable() const {
312
322
return {};
313
323
}
314
324
bool ThreadPlanStack::AnyPlans () const {
315
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
325
+ llvm::sys::ScopedReader guard (m_stack_mutex);
316
326
// There is always a base plan...
317
327
return m_plans.size () > 1 ;
318
328
}
319
329
320
330
bool ThreadPlanStack::AnyCompletedPlans () const {
321
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
331
+ llvm::sys::ScopedReader guard (m_stack_mutex);
322
332
return !m_completed_plans.empty ();
323
333
}
324
334
325
335
bool ThreadPlanStack::AnyDiscardedPlans () const {
326
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
336
+ llvm::sys::ScopedReader guard (m_stack_mutex);
327
337
return !m_discarded_plans.empty ();
328
338
}
329
339
330
340
bool ThreadPlanStack::IsPlanDone (ThreadPlan *in_plan) const {
331
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
341
+ llvm::sys::ScopedReader guard (m_stack_mutex);
332
342
for (auto plan : m_completed_plans) {
333
343
if (plan.get () == in_plan)
334
344
return true ;
@@ -337,7 +347,7 @@ bool ThreadPlanStack::IsPlanDone(ThreadPlan *in_plan) const {
337
347
}
338
348
339
349
bool ThreadPlanStack::WasPlanDiscarded (ThreadPlan *in_plan) const {
340
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
350
+ llvm::sys::ScopedReader guard (m_stack_mutex);
341
351
for (auto plan : m_discarded_plans) {
342
352
if (plan.get () == in_plan)
343
353
return true ;
@@ -346,7 +356,7 @@ bool ThreadPlanStack::WasPlanDiscarded(ThreadPlan *in_plan) const {
346
356
}
347
357
348
358
ThreadPlan *ThreadPlanStack::GetPreviousPlan (ThreadPlan *current_plan) const {
349
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
359
+ llvm::sys::ScopedReader guard (m_stack_mutex);
350
360
if (current_plan == nullptr )
351
361
return nullptr ;
352
362
@@ -361,7 +371,7 @@ ThreadPlan *ThreadPlanStack::GetPreviousPlan(ThreadPlan *current_plan) const {
361
371
// If this is the first completed plan, the previous one is the
362
372
// bottom of the regular plan stack.
363
373
if (stack_size > 0 && m_completed_plans[0 ].get () == current_plan) {
364
- return GetCurrentPlan ().get ();
374
+ return GetCurrentPlanNoLock ().get ();
365
375
}
366
376
367
377
// Otherwise look for it in the regular plans.
@@ -374,7 +384,7 @@ ThreadPlan *ThreadPlanStack::GetPreviousPlan(ThreadPlan *current_plan) const {
374
384
}
375
385
376
386
ThreadPlan *ThreadPlanStack::GetInnermostExpression () const {
377
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
387
+ llvm::sys::ScopedReader guard (m_stack_mutex);
378
388
int stack_size = m_plans.size ();
379
389
380
390
for (int i = stack_size - 1 ; i > 0 ; i--) {
@@ -385,13 +395,13 @@ ThreadPlan *ThreadPlanStack::GetInnermostExpression() const {
385
395
}
386
396
387
397
void ThreadPlanStack::ClearThreadCache () {
388
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
398
+ llvm::sys::ScopedReader guard (m_stack_mutex);
389
399
for (lldb::ThreadPlanSP thread_plan_sp : m_plans)
390
400
thread_plan_sp->ClearThreadCache ();
391
401
}
392
402
393
403
void ThreadPlanStack::WillResume () {
394
- std::lock_guard<std::recursive_mutex> guard (m_stack_mutex);
404
+ llvm::sys::ScopedWriter guard (m_stack_mutex);
395
405
m_completed_plans.clear ();
396
406
m_discarded_plans.clear ();
397
407
}
0 commit comments