// Copyright 2019 yuzu Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include #include "common/common_types.h" #include "core/core_timing.h" namespace Core { class System; } // namespace Core namespace Memory { // A class that will effectively freeze memory values. class Freezer { public: struct Entry { VAddr address; u8 width; u64 value; }; Freezer(Core::Timing::CoreTiming& core_timing); ~Freezer(); void SetActive(bool active); bool IsActive() const; void Clear(); u64 Freeze(VAddr address, u8 width); void Unfreeze(VAddr address); bool IsFrozen(VAddr address); void SetFrozenValue(VAddr address, u64 value); std::optional GetEntry(VAddr address); std::vector GetEntries(); private: void FrameCallback(u64 userdata, s64 cycles_late); void FillEntryReads(); std::atomic_bool active{false}; std::recursive_mutex entries_mutex; std::vector entries; Core::Timing::EventType* event; Core::Timing::CoreTiming& core_timing; }; } // namespace Memory