summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinQt/Debugger
diff options
context:
space:
mode:
authorTryTwo <taolas@gmail.com>2023-11-27 17:08:31 -0700
committerTryTwo <taolas@gmail.com>2025-02-04 00:21:13 -0700
commitbbf72e79f90714be6f1de4eea080911e7070f488 (patch)
tree3bdbe8048dc305ae01f9491798ba55747f6b4164 /Source/Core/DolphinQt/Debugger
parent696b363f478961bb18420b79ef9f09eabd600e55 (diff)
Breakpoints: Fix lag when adding or removing multiple memory breakpoints by only calling DBATUpdated() once.
Diffstat (limited to 'Source/Core/DolphinQt/Debugger')
-rw-r--r--Source/Core/DolphinQt/Debugger/MemoryViewWidget.cpp45
1 files changed, 26 insertions, 19 deletions
diff --git a/Source/Core/DolphinQt/Debugger/MemoryViewWidget.cpp b/Source/Core/DolphinQt/Debugger/MemoryViewWidget.cpp
index fcf57c8acf..1775d180fa 100644
--- a/Source/Core/DolphinQt/Debugger/MemoryViewWidget.cpp
+++ b/Source/Core/DolphinQt/Debugger/MemoryViewWidget.cpp
@@ -817,29 +817,36 @@ void MemoryViewWidget::ToggleBreakpoint(u32 addr, bool row)
if (row && memchecks.OverlapsMemcheck(addr, m_bytes_per_row))
overlap = true;
- for (int i = 0; i < breaks; i++)
{
- u32 address = addr + length * i;
- TMemCheck* check_ptr = memchecks.GetMemCheck(address, length);
+ const Core::CPUThreadGuard guard(m_system);
- if (check_ptr == nullptr && !overlap)
- {
- TMemCheck check;
- check.start_address = address;
- check.end_address = check.start_address + length - 1;
- check.is_ranged = length > 0;
- check.is_break_on_read = (m_bp_type == BPType::ReadOnly || m_bp_type == BPType::ReadWrite);
- check.is_break_on_write = (m_bp_type == BPType::WriteOnly || m_bp_type == BPType::ReadWrite);
- check.log_on_hit = m_do_log;
- check.break_on_hit = true;
-
- memchecks.Add(std::move(check));
- }
- else if (check_ptr != nullptr)
+ for (int i = 0; i < breaks; i++)
{
- // Using the pointer fixes misaligned breakpoints (0x11 breakpoint in 0x10 aligned view).
- memchecks.Remove(check_ptr->start_address);
+ u32 address = addr + length * i;
+ TMemCheck* check_ptr = memchecks.GetMemCheck(address, length);
+
+ if (check_ptr == nullptr && !overlap)
+ {
+ TMemCheck check;
+ check.start_address = address;
+ check.end_address = check.start_address + length - 1;
+ check.is_ranged = length > 0;
+ check.is_break_on_read = (m_bp_type == BPType::ReadOnly || m_bp_type == BPType::ReadWrite);
+ check.is_break_on_write =
+ (m_bp_type == BPType::WriteOnly || m_bp_type == BPType::ReadWrite);
+ check.log_on_hit = m_do_log;
+ check.break_on_hit = true;
+
+ memchecks.Add(std::move(check), false);
+ }
+ else if (check_ptr != nullptr)
+ {
+ // Using the pointer fixes misaligned breakpoints (0x11 breakpoint in 0x10 aligned view).
+ memchecks.Remove(check_ptr->start_address, false);
+ }
}
+
+ memchecks.Update();
}
emit Host::GetInstance()->PPCBreakpointsChanged();