From 9703501b54b4400b8b315c149f5ae71264a81ea3 Mon Sep 17 00:00:00 2001 From: Gliniak Date: Wed, 21 May 2025 22:47:10 +0200 Subject: [PATCH] [XThread] Changed behaviour for threads requesting Yield with non-alertable state --- src/xenia/kernel/xthread.cc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/xenia/kernel/xthread.cc b/src/xenia/kernel/xthread.cc index 559afd6bd..05b5613dc 100644 --- a/src/xenia/kernel/xthread.cc +++ b/src/xenia/kernel/xthread.cc @@ -763,13 +763,8 @@ X_STATUS XThread::Delay(uint32_t processor_mode, uint32_t alertable, timeout_ms = uint32_t(-timeout_ticks / 10000); // Ticks -> MS } else { timeout_ms = 0; - // TODO(Gliniak): Check how it works, but it seems outright wrong. - // However some titles like to change priority then go to sleep with timeout - // 0. - if (priority_ <= xe::threading::ThreadPriority::kBelowNormal) { - timeout_ms = 1; - } } + timeout_ms = Clock::ScaleGuestDurationMillis(timeout_ms); if (alertable) { auto result = @@ -782,9 +777,18 @@ X_STATUS XThread::Delay(uint32_t processor_mode, uint32_t alertable, return X_STATUS_USER_APC; } } else { - xe::threading::Sleep(std::chrono::milliseconds(timeout_ms)); - return X_STATUS_SUCCESS; + if (timeout_ms == 0) { + if (priority_ <= xe::threading::ThreadPriority::kBelowNormal) { + xe::threading::NanoSleep(100); + } else { + xe::threading::MaybeYield(); + } + } else { + xe::threading::Sleep(std::chrono::milliseconds(timeout_ms)); + } } + + return X_STATUS_SUCCESS; } struct ThreadSavedState {