Merge pull request #28 from bunnei/sleepthread
svc: Improve SleepThread for yield types.
This commit is contained in:
@@ -947,12 +947,24 @@ static void ExitThread() {
|
|||||||
|
|
||||||
/// Sleep the current thread
|
/// Sleep the current thread
|
||||||
static void SleepThread(s64 nanoseconds) {
|
static void SleepThread(s64 nanoseconds) {
|
||||||
LOG_TRACE(Kernel_SVC, "called nanoseconds={}", nanoseconds);
|
LOG_DEBUG(Kernel_SVC, "called nanoseconds={}", nanoseconds);
|
||||||
|
|
||||||
// Don't attempt to yield execution if there are no available threads to run,
|
if (nanoseconds == 0) {
|
||||||
// this way we avoid a useless reschedule to the idle thread.
|
// Yield type 0 is just a yield without load balancing
|
||||||
if (nanoseconds == 0 && !Core::System::GetInstance().CurrentScheduler().HaveReadyThreads())
|
Core::System::GetInstance().CpuCore(0).PrepareReschedule();
|
||||||
|
Core::System::GetInstance().CpuCore(1).PrepareReschedule();
|
||||||
|
Core::System::GetInstance().CpuCore(2).PrepareReschedule();
|
||||||
|
Core::System::GetInstance().CpuCore(3).PrepareReschedule();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nanoseconds < 0) {
|
||||||
|
UNIMPLEMENTED_MSG("unimplemented yield type");
|
||||||
|
|
||||||
|
// TODO(bunnei): Implement the various load balancing yield types here. This will force a
|
||||||
|
// reschedule, but is incorrect.
|
||||||
|
nanoseconds = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Sleep current thread and check for next thread to schedule
|
// Sleep current thread and check for next thread to schedule
|
||||||
WaitCurrentThread_Sleep();
|
WaitCurrentThread_Sleep();
|
||||||
@@ -960,7 +972,10 @@ static void SleepThread(s64 nanoseconds) {
|
|||||||
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
||||||
GetCurrentThread()->WakeAfterDelay(nanoseconds);
|
GetCurrentThread()->WakeAfterDelay(nanoseconds);
|
||||||
|
|
||||||
Core::System::GetInstance().PrepareReschedule();
|
Core::System::GetInstance().CpuCore(0).PrepareReschedule();
|
||||||
|
Core::System::GetInstance().CpuCore(1).PrepareReschedule();
|
||||||
|
Core::System::GetInstance().CpuCore(2).PrepareReschedule();
|
||||||
|
Core::System::GetInstance().CpuCore(3).PrepareReschedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Wait process wide key atomic
|
/// Wait process wide key atomic
|
||||||
|
|||||||
Reference in New Issue
Block a user