From 198c6ad0d728447dc97e467c8fb08f0b54c8a742 Mon Sep 17 00:00:00 2001
From: FernandoS27 <fsahmkow27@gmail.com>
Date: Tue, 5 Oct 2021 23:54:33 +0200
Subject: Suspend temporally

---
 src/core/core.cpp | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

(limited to 'src/core/core.cpp')

diff --git a/src/core/core.cpp b/src/core/core.cpp
index 3532839dfa..4abf037e29 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -140,25 +140,45 @@ struct System::Impl {
           cpu_manager{system}, reporter{system}, applet_manager{system}, time_manager{system} {}
 
     SystemResultStatus Run() {
+        std::unique_lock<std::mutex> lk(suspend_guard);
         status = SystemResultStatus::Success;
 
         kernel.Suspend(false);
         core_timing.SyncPause(false);
         cpu_manager.Pause(false);
+        is_paused = false;
 
         return status;
     }
 
     SystemResultStatus Pause() {
+        std::unique_lock<std::mutex> lk(suspend_guard);
         status = SystemResultStatus::Success;
 
         core_timing.SyncPause(true);
         kernel.Suspend(true);
         cpu_manager.Pause(true);
+        is_paused = true;
 
         return status;
     }
 
+    void stallForGPU(bool pause) {
+        if (pause) {
+            suspend_guard.lock();
+            kernel.Suspend(pause);
+            core_timing.SyncPause(pause);
+            cpu_manager.Pause(pause);
+        } else {
+            if (!is_paused) {
+                core_timing.SyncPause(pause);
+                kernel.Suspend(pause);
+                cpu_manager.Pause(pause);
+            }
+            suspend_guard.unlock();
+        }
+    }
+
     SystemResultStatus Init(System& system, Frontend::EmuWindow& emu_window) {
         LOG_DEBUG(Core, "initialized OK");
 
@@ -367,6 +387,9 @@ struct System::Impl {
         return perf_stats->GetAndResetStats(core_timing.GetGlobalTimeUs());
     }
 
+    std::mutex suspend_guard;
+    bool is_paused{};
+
     Timing::CoreTiming core_timing;
     Kernel::KernelCore kernel;
     /// RealVfsFilesystem instance
@@ -464,6 +487,10 @@ void System::Shutdown() {
     impl->Shutdown();
 }
 
+void System::stallForGPU(bool pause) {
+    impl->stallForGPU(pause);
+}
+
 SystemResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::string& filepath,
                                 u64 program_id, std::size_t program_index) {
     return impl->Load(*this, emu_window, filepath, program_id, program_index);
-- 
cgit v1.2.3-70-g09d2