summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/k_scheduler.cpp21
-rw-r--r--src/core/hle/kernel/k_scheduler.h2
-rw-r--r--src/core/hle/kernel/k_thread.cpp8
3 files changed, 21 insertions, 10 deletions
diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp
index d9ba8e409..c34ce7a17 100644
--- a/src/core/hle/kernel/k_scheduler.cpp
+++ b/src/core/hle/kernel/k_scheduler.cpp
@@ -63,14 +63,8 @@ void KScheduler::EnableScheduling(KernelCore& kernel, u64 cores_needing_scheduli
63 auto* scheduler{kernel.CurrentScheduler()}; 63 auto* scheduler{kernel.CurrentScheduler()};
64 64
65 if (!scheduler || kernel.IsPhantomModeForSingleCore()) { 65 if (!scheduler || kernel.IsPhantomModeForSingleCore()) {
66 // HACK: we cannot schedule from this thread, it is not a core thread 66 KScheduler::RescheduleCores(kernel, cores_needing_scheduling);
67 RescheduleCores(kernel, cores_needing_scheduling); 67 KScheduler::RescheduleCurrentHLEThread(kernel);
68 if (GetCurrentThread(kernel).GetDisableDispatchCount() == 1) {
69 // Special case to ensure dummy threads that are waiting block
70 GetCurrentThread(kernel).IfDummyThreadTryWait();
71 }
72 GetCurrentThread(kernel).EnableDispatch();
73 ASSERT(GetCurrentThread(kernel).GetState() != ThreadState::Waiting);
74 return; 68 return;
75 } 69 }
76 70
@@ -83,6 +77,17 @@ void KScheduler::EnableScheduling(KernelCore& kernel, u64 cores_needing_scheduli
83 } 77 }
84} 78}
85 79
80void KScheduler::RescheduleCurrentHLEThread(KernelCore& kernel) {
81 // HACK: we cannot schedule from this thread, it is not a core thread
82 ASSERT(GetCurrentThread(kernel).GetDisableDispatchCount() == 1);
83
84 // Special case to ensure dummy threads that are waiting block
85 GetCurrentThread(kernel).IfDummyThreadTryWait();
86
87 ASSERT(GetCurrentThread(kernel).GetState() != ThreadState::Waiting);
88 GetCurrentThread(kernel).EnableDispatch();
89}
90
86u64 KScheduler::UpdateHighestPriorityThreads(KernelCore& kernel) { 91u64 KScheduler::UpdateHighestPriorityThreads(KernelCore& kernel) {
87 if (IsSchedulerUpdateNeeded(kernel)) { 92 if (IsSchedulerUpdateNeeded(kernel)) {
88 return UpdateHighestPriorityThreadsImpl(kernel); 93 return UpdateHighestPriorityThreadsImpl(kernel);
diff --git a/src/core/hle/kernel/k_scheduler.h b/src/core/hle/kernel/k_scheduler.h
index ac7421c9a..534321d8d 100644
--- a/src/core/hle/kernel/k_scheduler.h
+++ b/src/core/hle/kernel/k_scheduler.h
@@ -119,6 +119,8 @@ private:
119 } 119 }
120 static u64 UpdateHighestPriorityThreadsImpl(KernelCore& kernel); 120 static u64 UpdateHighestPriorityThreadsImpl(KernelCore& kernel);
121 121
122 static void RescheduleCurrentHLEThread(KernelCore& kernel);
123
122 // Instanced private API. 124 // Instanced private API.
123 void ScheduleImpl(); 125 void ScheduleImpl();
124 void ScheduleImplFiber(); 126 void ScheduleImplFiber();
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp
index 985ce448e..174afc80d 100644
--- a/src/core/hle/kernel/k_thread.cpp
+++ b/src/core/hle/kernel/k_thread.cpp
@@ -1106,6 +1106,8 @@ void KThread::IfDummyThreadTryWait() {
1106 return; 1106 return;
1107 } 1107 }
1108 1108
1109 ASSERT(!kernel.IsPhantomModeForSingleCore());
1110
1109 // Block until we are no longer waiting. 1111 // Block until we are no longer waiting.
1110 std::unique_lock lk(dummy_wait_lock); 1112 std::unique_lock lk(dummy_wait_lock);
1111 dummy_wait_cv.wait( 1113 dummy_wait_cv.wait(
@@ -1211,10 +1213,12 @@ KScopedDisableDispatch::~KScopedDisableDispatch() {
1211 } 1213 }
1212 1214
1213 if (GetCurrentThread(kernel).GetDisableDispatchCount() <= 1) { 1215 if (GetCurrentThread(kernel).GetDisableDispatchCount() <= 1) {
1214 auto scheduler = kernel.CurrentScheduler(); 1216 auto* scheduler = kernel.CurrentScheduler();
1215 1217
1216 if (scheduler) { 1218 if (scheduler && !kernel.IsPhantomModeForSingleCore()) {
1217 scheduler->RescheduleCurrentCore(); 1219 scheduler->RescheduleCurrentCore();
1220 } else {
1221 KScheduler::RescheduleCurrentHLEThread(kernel);
1218 } 1222 }
1219 } else { 1223 } else {
1220 GetCurrentThread(kernel).EnableDispatch(); 1224 GetCurrentThread(kernel).EnableDispatch();