|
|
|
|
@ -145,36 +145,6 @@ static bool DefaultThreadWakeupCallback(ThreadWakeupReason reason, SharedPtr<Thr
|
|
|
|
|
return true;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/// Wait for a kernel object to synchronize, timeout after the specified nanoseconds
|
|
|
|
|
static ResultCode WaitSynchronization1(
|
|
|
|
|
SharedPtr<WaitObject> object, Thread* thread, s64 nano_seconds = -1,
|
|
|
|
|
std::function<Thread::WakeupCallback> wakeup_callback = DefaultThreadWakeupCallback) {
|
|
|
|
|
|
|
|
|
|
if (!object) {
|
|
|
|
|
return ERR_INVALID_HANDLE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (object->ShouldWait(thread)) {
|
|
|
|
|
if (nano_seconds == 0) {
|
|
|
|
|
return RESULT_TIMEOUT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
thread->wait_objects = {object};
|
|
|
|
|
object->AddWaitingThread(thread);
|
|
|
|
|
thread->status = THREADSTATUS_WAIT_SYNCH_ANY;
|
|
|
|
|
|
|
|
|
|
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
|
|
|
|
thread->WakeAfterDelay(nano_seconds);
|
|
|
|
|
thread->wakeup_callback = wakeup_callback;
|
|
|
|
|
|
|
|
|
|
Core::System::GetInstance().PrepareReschedule();
|
|
|
|
|
} else {
|
|
|
|
|
object->Acquire(thread);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return RESULT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Wait for the given handles to synchronize, timeout after the specified nanoseconds
|
|
|
|
|
static ResultCode WaitSynchronization(Handle* index, VAddr handles_address, u64 handle_count,
|
|
|
|
|
s64 nano_seconds) {
|
|
|
|
|
|