From e794109a67f2edf79c52afb370aeb5907926cc64 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Fri, 30 Oct 2020 03:19:13 +0300 Subject: [PATCH] perf_meter.hpp: fix double rdtsc bug, add restart() method --- rpcs3/Emu/Cell/SPUThread.cpp | 4 +--- rpcs3/Emu/perf_meter.hpp | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 2656c9acb8..552c9b5b14 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -2750,9 +2750,7 @@ bool spu_thread::process_mfc_cmd() std::this_thread::yield(); // Reset perf - perf_meter<'x'> dummy; - perf0 = dummy; - dummy.reset(); + perf0.restart(); } alignas(64) spu_rdata_t temp; diff --git a/rpcs3/Emu/perf_meter.hpp b/rpcs3/Emu/perf_meter.hpp index 6a09912e7e..93101f0a99 100644 --- a/rpcs3/Emu/perf_meter.hpp +++ b/rpcs3/Emu/perf_meter.hpp @@ -83,18 +83,17 @@ template class perf_meter { // Initialize array (possibly only 1 element) with timestamp - u64 m_timestamps[1 + sizeof...(SubEvents)] = {__rdtsc()}; + u64 m_timestamps[1 + sizeof...(SubEvents)]; public: - SAFE_BUFFERS perf_meter() noexcept + SAFE_BUFFERS FORCE_INLINE perf_meter() noexcept { - m_timestamps[0] = __rdtsc(); - std::memset(m_timestamps + 1, 0, sizeof(m_timestamps) - sizeof(u64)); + restart(); } // Copy first timestamp template - SAFE_BUFFERS perf_meter(const perf_meter& r) noexcept + SAFE_BUFFERS FORCE_INLINE perf_meter(const perf_meter& r) noexcept { m_timestamps[0] = r.get(); std::memset(m_timestamps + 1, 0, sizeof(m_timestamps) - sizeof(u64)); @@ -147,11 +146,18 @@ public: } // Disable this counter - SAFE_BUFFERS void reset() noexcept + SAFE_BUFFERS FORCE_INLINE void reset() noexcept { m_timestamps[0] = 0; } + // Re-initialize first timestamp + SAFE_BUFFERS FORCE_INLINE void restart() noexcept + { + m_timestamps[0] = __rdtsc(); + std::memset(m_timestamps + 1, 0, sizeof(m_timestamps) - sizeof(u64)); + } + SAFE_BUFFERS ~perf_meter() { // Disabled counter