32
32
33
33
BreakpointManager g_breakpoints;
34
34
35
- void MemCheck::Log (u32 addr, bool write, int size, u32 pc, const char *reason) {
35
+ void MemCheck::Log (u32 addr, bool write, int size, u32 pc, const char *reason) const {
36
36
if (result & BREAK_ACTION_LOG) {
37
37
const char *type = write ? " Write" : " Read" ;
38
38
if (logFormat.empty ()) {
@@ -71,11 +71,9 @@ BreakAction MemCheck::Action(u32 addr, bool write, int size, u32 pc, const char
71
71
}
72
72
73
73
// Note: must lock while calling this.
74
- size_t BreakpointManager::FindBreakpoint (u32 addr, bool matchTemp, bool temp)
75
- {
74
+ size_t BreakpointManager::FindBreakpoint (u32 addr, bool matchTemp, bool temp) {
76
75
size_t found = INVALID_BREAKPOINT;
77
- for (size_t i = 0 ; i < breakPoints_.size (); ++i)
78
- {
76
+ for (size_t i = 0 ; i < breakPoints_.size (); ++i) {
79
77
const auto &bp = breakPoints_[i];
80
78
if (bp.addr == addr && (!matchTemp || bp.temporary == temp))
81
79
{
@@ -90,10 +88,8 @@ size_t BreakpointManager::FindBreakpoint(u32 addr, bool matchTemp, bool temp)
90
88
return found;
91
89
}
92
90
93
- size_t BreakpointManager::FindMemCheck (u32 start, u32 end)
94
- {
95
- for (size_t i = 0 ; i < memChecks_.size (); ++i)
96
- {
91
+ size_t BreakpointManager::FindMemCheck (u32 start, u32 end) {
92
+ for (size_t i = 0 ; i < memChecks_.size (); ++i) {
97
93
if (memChecks_[i].start == start && memChecks_[i].end == end)
98
94
return i;
99
95
}
@@ -155,14 +151,11 @@ int BreakpointManager::AddBreakPoint(u32 addr, bool temp) {
155
151
156
152
breakPoints_.push_back (pt);
157
153
anyBreakPoints_ = true ;
158
- guard.unlock ();
159
154
Update (addr);
160
-
161
155
return (int )breakPoints_.size () - 1 ;
162
156
} else if (!breakPoints_[bp].IsEnabled ()) {
163
157
breakPoints_[bp].result |= BREAK_ACTION_PAUSE;
164
158
breakPoints_[bp].hasCond = false ;
165
- guard.unlock ();
166
159
Update (addr);
167
160
return (int )bp;
168
161
} else {
@@ -183,7 +176,6 @@ void BreakpointManager::RemoveBreakPoint(u32 addr) {
183
176
breakPoints_.erase (breakPoints_.begin () + bp);
184
177
185
178
anyBreakPoints_ = !breakPoints_.empty ();
186
- guard.unlock ();
187
179
Update (addr);
188
180
}
189
181
}
@@ -196,8 +188,6 @@ void BreakpointManager::ChangeBreakPoint(u32 addr, bool status) {
196
188
breakPoints_[bp].result |= BREAK_ACTION_PAUSE;
197
189
else
198
190
breakPoints_[bp].result = BreakAction (breakPoints_[bp].result & ~BREAK_ACTION_PAUSE);
199
-
200
- guard.unlock ();
201
191
Update (addr);
202
192
}
203
193
}
@@ -207,7 +197,6 @@ void BreakpointManager::ChangeBreakPoint(u32 addr, BreakAction result) {
207
197
size_t bp = FindBreakpoint (addr);
208
198
if (bp != INVALID_BREAKPOINT) {
209
199
breakPoints_[bp].result = result;
210
- guard.unlock ();
211
200
Update (addr);
212
201
}
213
202
}
@@ -220,7 +209,6 @@ void BreakpointManager::ClearAllBreakPoints()
220
209
if (!breakPoints_.empty ())
221
210
{
222
211
breakPoints_.clear ();
223
- guard.unlock ();
224
212
Update ();
225
213
}
226
214
}
@@ -230,20 +218,14 @@ void BreakpointManager::ClearTemporaryBreakPoints()
230
218
if (!anyBreakPoints_)
231
219
return ;
232
220
std::unique_lock<std::mutex> guard (breakPointsMutex_);
233
-
234
- bool update = false ;
235
221
for (int i = (int )breakPoints_.size ()-1 ; i >= 0 ; --i)
236
222
{
237
223
if (breakPoints_[i].temporary )
238
224
{
239
225
breakPoints_.erase (breakPoints_.begin () + i);
240
- update = true ;
226
+ Update () ;
241
227
}
242
228
}
243
-
244
- guard.unlock ();
245
- if (update)
246
- Update ();
247
229
}
248
230
249
231
void BreakpointManager::ChangeBreakPointAddCond (u32 addr, const BreakPointCond &cond)
@@ -254,38 +236,32 @@ void BreakpointManager::ChangeBreakPointAddCond(u32 addr, const BreakPointCond &
254
236
{
255
237
breakPoints_[bp].hasCond = true ;
256
238
breakPoints_[bp].cond = cond;
257
- guard.unlock ();
258
239
Update (addr);
259
240
}
260
241
}
261
242
262
- void BreakpointManager::ChangeBreakPointRemoveCond (u32 addr)
263
- {
243
+ void BreakpointManager::ChangeBreakPointRemoveCond (u32 addr) {
264
244
std::unique_lock<std::mutex> guard (breakPointsMutex_);
265
245
size_t bp = FindBreakpoint (addr);
266
- if (bp != INVALID_BREAKPOINT)
267
- {
246
+ if (bp != INVALID_BREAKPOINT) {
268
247
breakPoints_[bp].hasCond = false ;
269
- guard.unlock ();
270
248
Update (addr);
271
249
}
272
250
}
273
251
274
- BreakPointCond *BreakpointManager::GetBreakPointCondition (u32 addr)
275
- {
252
+ BreakPointCond *BreakpointManager::GetBreakPointCondition (u32 addr) {
276
253
std::lock_guard<std::mutex> guard (breakPointsMutex_);
277
254
size_t bp = FindBreakpoint (addr);
278
255
if (bp != INVALID_BREAKPOINT && breakPoints_[bp].hasCond )
279
256
return &breakPoints_[bp].cond ;
280
- return NULL ;
257
+ return nullptr ;
281
258
}
282
259
283
260
void BreakpointManager::ChangeBreakPointLogFormat (u32 addr, const std::string &fmt) {
284
261
std::unique_lock<std::mutex> guard (breakPointsMutex_);
285
262
size_t bp = FindBreakpoint (addr, true , false );
286
263
if (bp != INVALID_BREAKPOINT) {
287
264
breakPoints_[bp].logFormat = fmt;
288
- guard.unlock ();
289
265
Update (addr);
290
266
}
291
267
}
@@ -338,18 +314,18 @@ int BreakpointManager::AddMemCheck(u32 start, u32 end, MemCheckCondition cond, B
338
314
339
315
memChecks_.push_back (check);
340
316
bool hadAny = anyMemChecks_.exchange (true );
341
- if (!hadAny)
317
+ if (!hadAny) {
342
318
MemBlockOverrideDetailed ();
343
- guard. unlock ();
319
+ }
344
320
Update ();
345
321
return (int )memChecks_.size () - 1 ;
346
322
} else {
347
323
memChecks_[mc].cond = (MemCheckCondition)(memChecks_[mc].cond | cond);
348
324
memChecks_[mc].result = (BreakAction)(memChecks_[mc].result | result);
349
325
bool hadAny = anyMemChecks_.exchange (true );
350
- if (!hadAny)
326
+ if (!hadAny) {
351
327
MemBlockOverrideDetailed ();
352
- guard. unlock ();
328
+ }
353
329
Update ();
354
330
return (int )mc;
355
331
}
@@ -366,7 +342,6 @@ void BreakpointManager::RemoveMemCheck(u32 start, u32 end)
366
342
bool hadAny = anyMemChecks_.exchange (!memChecks_.empty ());
367
343
if (hadAny)
368
344
MemBlockReleaseDetailed ();
369
- guard.unlock ();
370
345
Update ();
371
346
}
372
347
}
@@ -379,7 +354,6 @@ void BreakpointManager::ChangeMemCheck(u32 start, u32 end, MemCheckCondition con
379
354
{
380
355
memChecks_[mc].cond = cond;
381
356
memChecks_[mc].result = result;
382
- guard.unlock ();
383
357
Update ();
384
358
}
385
359
}
@@ -394,7 +368,6 @@ void BreakpointManager::ClearAllMemChecks()
394
368
bool hadAny = anyMemChecks_.exchange (false );
395
369
if (hadAny)
396
370
MemBlockReleaseDetailed ();
397
- guard.unlock ();
398
371
Update ();
399
372
}
400
373
}
@@ -406,7 +379,6 @@ void BreakpointManager::ChangeMemCheckAddCond(u32 start, u32 end, const BreakPoi
406
379
if (mc != INVALID_MEMCHECK) {
407
380
memChecks_[mc].hasCondition = true ;
408
381
memChecks_[mc].condition = cond;
409
- guard.unlock ();
410
382
// No need to update jit for a condition add/remove, they're not baked in.
411
383
Update (-1 );
412
384
}
@@ -417,7 +389,6 @@ void BreakpointManager::ChangeMemCheckRemoveCond(u32 start, u32 end) {
417
389
size_t mc = FindMemCheck (start, end);
418
390
if (mc != INVALID_MEMCHECK) {
419
391
memChecks_[mc].hasCondition = false ;
420
- guard.unlock ();
421
392
// No need to update jit for a condition add/remove, they're not baked in.
422
393
Update (-1 );
423
394
}
@@ -436,7 +407,6 @@ void BreakpointManager::ChangeMemCheckLogFormat(u32 start, u32 end, const std::s
436
407
size_t mc = FindMemCheck (start, end);
437
408
if (mc != INVALID_MEMCHECK) {
438
409
memChecks_[mc].logFormat = fmt;
439
- guard.unlock ();
440
410
Update ();
441
411
}
442
412
}
@@ -620,30 +590,27 @@ std::vector<BreakPoint> BreakpointManager::GetBreakpoints() {
620
590
return breakPoints_;
621
591
}
622
592
623
- void BreakpointManager::Update (u32 addr) {
624
- if (MIPSComp::jit && addr != -1 ) {
625
- bool resume = false ;
626
- if (Core_IsStepping () == false ) {
627
- Core_Break (BreakReason::BreakpointUpdate, addr);
628
- Core_WaitInactive ();
629
- resume = true ;
630
- }
593
+ void BreakpointManager::Frame () {
594
+ // outside the lock here, should be ok.
595
+ if (!needsUpdate_) {
596
+ return ;
597
+ }
631
598
599
+ std::lock_guard<std::mutex> guard (breakPointsMutex_);
600
+ if (MIPSComp::jit && updateAddr_ != -1 ) {
632
601
// In case this is a delay slot, clear the previous instruction too.
633
- if (addr != 0 )
634
- mipsr4k.InvalidateICache (addr - 4 , 8 );
602
+ if (updateAddr_ != 0 )
603
+ mipsr4k.InvalidateICache (updateAddr_ - 4 , 8 );
635
604
else
636
605
mipsr4k.ClearJitCache ();
637
-
638
- if (resume)
639
- Core_Resume ();
640
606
}
641
607
642
- if (anyMemChecks_ && addr != -1 )
608
+ if (anyMemChecks_ && updateAddr_ != -1 )
643
609
UpdateCachedMemCheckRanges ();
644
610
645
611
// Redraw in order to show the breakpoint.
646
612
System_Notify (SystemNotification::DISASSEMBLY);
613
+ needsUpdate_ = false ;
647
614
}
648
615
649
616
bool BreakpointManager::ValidateLogFormat (MIPSDebugInterface *cpu, const std::string &fmt) {
0 commit comments