Просмотр исходного кода

SingleCore: Improve Cycle timing Behavior and replace mutex in global scheduler for spinlock.

Fernando Sahmkow 6 лет назад
Родитель
Сommit
7e2ce2f7f4

+ 1 - 0
src/core/cpu_manager.cpp

@@ -253,6 +253,7 @@ void CpuManager::SingleCoreRunIdleThread() {
     while (true) {
         auto& physical_core = kernel.CurrentPhysicalCore();
         PreemptSingleCore(false);
+        system.CoreTiming().AddTicks(1000U);
         idle_count++;
         auto& scheduler = physical_core.Scheduler();
         scheduler.TryDoContextSwitch();

+ 1 - 1
src/core/hle/kernel/scheduler.h

@@ -188,7 +188,7 @@ private:
 
     /// Scheduler lock mechanisms.
     bool is_locked{};
-    std::mutex inner_lock{}; // TODO(Blinkhawk): Replace for a SpinLock
+    Common::SpinLock inner_lock{};
     std::atomic<s64> scope_lock{};
     Core::EmuThreadHandle current_owner{Core::EmuThreadHandle::InvalidHandle()};
 

+ 2 - 1
src/core/hle/kernel/server_session.cpp

@@ -185,7 +185,8 @@ ResultCode ServerSession::CompleteSyncRequest() {
 ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread,
                                             Core::Memory::Memory& memory) {
     ResultCode result = QueueSyncRequest(std::move(thread), memory);
-    Core::System::GetInstance().CoreTiming().ScheduleEvent(0, request_event, {});
+    const u64 delay = kernel.IsMulticore() ? 0U : 20000U;
+    Core::System::GetInstance().CoreTiming().ScheduleEvent(delay, request_event, {});
     return result;
 }