diff options
| author | 2022-09-10 01:48:15 -0700 | |
|---|---|---|
| committer | 2022-10-18 19:13:35 -0700 | |
| commit | a4d11f4427859cbe82fc825f8493844e17bb668f (patch) | |
| tree | d1844e8ad7bcfd3c9467cad75091bc207fba7103 /src/core/core_timing.cpp | |
| parent | core: hle: kernel: Fix InitializePreemption order. (diff) | |
| download | yuzu-a4d11f4427859cbe82fc825f8493844e17bb668f.tar.gz yuzu-a4d11f4427859cbe82fc825f8493844e17bb668f.tar.xz yuzu-a4d11f4427859cbe82fc825f8493844e17bb668f.zip | |
core: Partially persist emulation state across game boots.
Diffstat (limited to 'src/core/core_timing.cpp')
| -rw-r--r-- | src/core/core_timing.cpp | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index 2678ce532..2afb2696c 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp | |||
| @@ -40,7 +40,17 @@ struct CoreTiming::Event { | |||
| 40 | CoreTiming::CoreTiming() | 40 | CoreTiming::CoreTiming() |
| 41 | : clock{Common::CreateBestMatchingClock(Hardware::BASE_CLOCK_RATE, Hardware::CNTFREQ)} {} | 41 | : clock{Common::CreateBestMatchingClock(Hardware::BASE_CLOCK_RATE, Hardware::CNTFREQ)} {} |
| 42 | 42 | ||
| 43 | CoreTiming::~CoreTiming() = default; | 43 | CoreTiming::~CoreTiming() { |
| 44 | paused = true; | ||
| 45 | shutting_down = true; | ||
| 46 | pause_event.Set(); | ||
| 47 | event.Set(); | ||
| 48 | if (timer_thread) { | ||
| 49 | timer_thread->join(); | ||
| 50 | } | ||
| 51 | timer_thread.reset(); | ||
| 52 | has_started = false; | ||
| 53 | } | ||
| 44 | 54 | ||
| 45 | void CoreTiming::ThreadEntry(CoreTiming& instance) { | 55 | void CoreTiming::ThreadEntry(CoreTiming& instance) { |
| 46 | constexpr char name[] = "HostTiming"; | 56 | constexpr char name[] = "HostTiming"; |
| @@ -65,17 +75,8 @@ void CoreTiming::Initialize(std::function<void()>&& on_thread_init_) { | |||
| 65 | } | 75 | } |
| 66 | } | 76 | } |
| 67 | 77 | ||
| 68 | void CoreTiming::Shutdown() { | 78 | void CoreTiming::ClearPendingEvents() { |
| 69 | paused = true; | 79 | event_queue.clear(); |
| 70 | shutting_down = true; | ||
| 71 | pause_event.Set(); | ||
| 72 | event.Set(); | ||
| 73 | if (timer_thread) { | ||
| 74 | timer_thread->join(); | ||
| 75 | } | ||
| 76 | ClearPendingEvents(); | ||
| 77 | timer_thread.reset(); | ||
| 78 | has_started = false; | ||
| 79 | } | 80 | } |
| 80 | 81 | ||
| 81 | void CoreTiming::Pause(bool is_paused) { | 82 | void CoreTiming::Pause(bool is_paused) { |
| @@ -196,10 +197,6 @@ u64 CoreTiming::GetClockTicks() const { | |||
| 196 | return CpuCyclesToClockCycles(ticks); | 197 | return CpuCyclesToClockCycles(ticks); |
| 197 | } | 198 | } |
| 198 | 199 | ||
| 199 | void CoreTiming::ClearPendingEvents() { | ||
| 200 | event_queue.clear(); | ||
| 201 | } | ||
| 202 | |||
| 203 | void CoreTiming::RemoveEvent(const std::shared_ptr<EventType>& event_type) { | 200 | void CoreTiming::RemoveEvent(const std::shared_ptr<EventType>& event_type) { |
| 204 | std::scoped_lock lock{basic_lock}; | 201 | std::scoped_lock lock{basic_lock}; |
| 205 | 202 | ||