diff options
| author | TryTwo <taolas@gmail.com> | 2023-11-27 17:08:31 -0700 |
|---|---|---|
| committer | TryTwo <taolas@gmail.com> | 2025-02-04 00:21:13 -0700 |
| commit | bbf72e79f90714be6f1de4eea080911e7070f488 (patch) | |
| tree | 3bdbe8048dc305ae01f9491798ba55747f6b4164 /Source/Core/DolphinQt/Debugger | |
| parent | 696b363f478961bb18420b79ef9f09eabd600e55 (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.cpp | 45 |
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(); |
