diff --git a/rpcs3/rpcs3qt/breakpoint_handler.cpp b/rpcs3/rpcs3qt/breakpoint_handler.cpp index d2c4c44bae..57ae05c28d 100644 --- a/rpcs3/rpcs3qt/breakpoint_handler.cpp +++ b/rpcs3/rpcs3qt/breakpoint_handler.cpp @@ -14,6 +14,9 @@ void breakpoint_handler::SetBreakOnBPM(bool break_on_bpm) bool breakpoint_handler::HasBreakpoint(u32 loc, bs_t type) { + if (m_empty.load(std::memory_order_acquire)) + return false; + std::lock_guard lock(mutex_breakpoints); return m_breakpoints.contains(loc) && ((m_breakpoints.at(loc) & type) == type); @@ -28,7 +31,14 @@ bool breakpoint_handler::AddBreakpoint(u32 loc, bs_t type) return false; } - return m_breakpoints.insert({loc, type}).second; + bool result = m_breakpoints.insert({loc, type}).second; + + if (result) + { + m_empty.store(false, std::memory_order_release); + } + + return result; } bool breakpoint_handler::RemoveBreakpoint(u32 loc) @@ -50,5 +60,11 @@ bool breakpoint_handler::RemoveBreakpoint(u32 loc) { ensure(ppu_breakpoint(loc, false)); } + + if (m_breakpoints.empty()) + { + m_empty.store(true, std::memory_order_release); + } + return true; } diff --git a/rpcs3/rpcs3qt/breakpoint_handler.h b/rpcs3/rpcs3qt/breakpoint_handler.h index f27f8031c2..05fdc221e2 100644 --- a/rpcs3/rpcs3qt/breakpoint_handler.h +++ b/rpcs3/rpcs3qt/breakpoint_handler.h @@ -4,6 +4,7 @@ #include "Utilities/bit_set.h" #include #include "Utilities/mutex.h" +#include enum class breakpoint_types { @@ -46,6 +47,7 @@ private: // TODO : generalize to hold multiple games and handle flags.Probably do : std::map>. // Although, externally, they'll only be accessed by loc (I think) so a map of maps may also do? shared_mutex mutex_breakpoints; + std::atomic m_empty{true}; std::map> m_breakpoints; //! Holds all breakpoints. bool m_break_on_bpm = false; };