|
|
|
@ -271,6 +271,24 @@ static ResultCode WaitSynchronization1(Kernel::Handle handle, s64 nano_seconds) |
|
|
|
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
|
|
|
thread->WakeAfterDelay(nano_seconds); |
|
|
|
|
|
|
|
thread->wakeup_callback = [](ThreadWakeupReason reason, |
|
|
|
Kernel::SharedPtr<Kernel::Thread> thread, |
|
|
|
Kernel::SharedPtr<Kernel::WaitObject> object) { |
|
|
|
|
|
|
|
ASSERT(thread->status == THREADSTATUS_WAIT_SYNCH_ANY); |
|
|
|
|
|
|
|
if (reason == ThreadWakeupReason::Timeout) { |
|
|
|
thread->SetWaitSynchronizationResult(Kernel::RESULT_TIMEOUT); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
ASSERT(reason == ThreadWakeupReason::Signal); |
|
|
|
thread->SetWaitSynchronizationResult(RESULT_SUCCESS); |
|
|
|
|
|
|
|
// WaitSynchronization1 doesn't have an output index like WaitSynchronizationN, so we
|
|
|
|
// don't have to do anything else here.
|
|
|
|
}; |
|
|
|
|
|
|
|
Core::System::GetInstance().PrepareReschedule(); |
|
|
|
|
|
|
|
// Note: The output of this SVC will be set to RESULT_SUCCESS if the thread
|
|
|
|
@ -344,6 +362,23 @@ static ResultCode WaitSynchronizationN(s32* out, Kernel::Handle* handles, s32 ha |
|
|
|
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
|
|
|
thread->WakeAfterDelay(nano_seconds); |
|
|
|
|
|
|
|
thread->wakeup_callback = [](ThreadWakeupReason reason, |
|
|
|
Kernel::SharedPtr<Kernel::Thread> thread, |
|
|
|
Kernel::SharedPtr<Kernel::WaitObject> object) { |
|
|
|
|
|
|
|
ASSERT(thread->status == THREADSTATUS_WAIT_SYNCH_ALL); |
|
|
|
|
|
|
|
if (reason == ThreadWakeupReason::Timeout) { |
|
|
|
thread->SetWaitSynchronizationResult(Kernel::RESULT_TIMEOUT); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
ASSERT(reason == ThreadWakeupReason::Signal); |
|
|
|
|
|
|
|
thread->SetWaitSynchronizationResult(RESULT_SUCCESS); |
|
|
|
// The wait_all case does not update the output index.
|
|
|
|
}; |
|
|
|
|
|
|
|
Core::System::GetInstance().PrepareReschedule(); |
|
|
|
|
|
|
|
// This value gets set to -1 by default in this case, it is not modified after this.
|
|
|
|
@ -389,12 +424,28 @@ static ResultCode WaitSynchronizationN(s32* out, Kernel::Handle* handles, s32 ha |
|
|
|
// Create an event to wake the thread up after the specified nanosecond delay has passed
|
|
|
|
thread->WakeAfterDelay(nano_seconds); |
|
|
|
|
|
|
|
thread->wakeup_callback = [](ThreadWakeupReason reason, |
|
|
|
Kernel::SharedPtr<Kernel::Thread> thread, |
|
|
|
Kernel::SharedPtr<Kernel::WaitObject> object) { |
|
|
|
|
|
|
|
ASSERT(thread->status == THREADSTATUS_WAIT_SYNCH_ANY); |
|
|
|
|
|
|
|
if (reason == ThreadWakeupReason::Timeout) { |
|
|
|
thread->SetWaitSynchronizationResult(Kernel::RESULT_TIMEOUT); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
ASSERT(reason == ThreadWakeupReason::Signal); |
|
|
|
|
|
|
|
thread->SetWaitSynchronizationResult(RESULT_SUCCESS); |
|
|
|
thread->SetWaitSynchronizationOutput(thread->GetWaitObjectIndex(object.get())); |
|
|
|
}; |
|
|
|
|
|
|
|
Core::System::GetInstance().PrepareReschedule(); |
|
|
|
|
|
|
|
// Note: The output of this SVC will be set to RESULT_SUCCESS if the thread resumes due to a
|
|
|
|
// signal in one of its wait objects.
|
|
|
|
// Otherwise we retain the default value of timeout, and -1 in the out parameter
|
|
|
|
thread->wait_set_output = true; |
|
|
|
*out = -1; |
|
|
|
return Kernel::RESULT_TIMEOUT; |
|
|
|
} |
|
|
|
@ -483,8 +534,6 @@ static ResultCode ReplyAndReceive(s32* index, Kernel::Handle* handles, s32 handl |
|
|
|
|
|
|
|
// No objects were ready to be acquired, prepare to suspend the thread.
|
|
|
|
|
|
|
|
// TODO(Subv): Perform IPC translation upon wakeup.
|
|
|
|
|
|
|
|
// Put the thread to sleep
|
|
|
|
thread->status = THREADSTATUS_WAIT_SYNCH_ANY; |
|
|
|
|
|
|
|
@ -496,12 +545,24 @@ static ResultCode ReplyAndReceive(s32* index, Kernel::Handle* handles, s32 handl |
|
|
|
|
|
|
|
thread->wait_objects = std::move(objects); |
|
|
|
|
|
|
|
thread->wakeup_callback = [](ThreadWakeupReason reason, |
|
|
|
Kernel::SharedPtr<Kernel::Thread> thread, |
|
|
|
Kernel::SharedPtr<Kernel::WaitObject> object) { |
|
|
|
|
|
|
|
ASSERT(thread->status == THREADSTATUS_WAIT_SYNCH_ANY); |
|
|
|
ASSERT(reason == ThreadWakeupReason::Signal); |
|
|
|
|
|
|
|
thread->SetWaitSynchronizationResult(RESULT_SUCCESS); |
|
|
|
thread->SetWaitSynchronizationOutput(thread->GetWaitObjectIndex(object.get())); |
|
|
|
|
|
|
|
// TODO(Subv): Perform IPC translation upon wakeup.
|
|
|
|
}; |
|
|
|
|
|
|
|
Core::System::GetInstance().PrepareReschedule(); |
|
|
|
|
|
|
|
// Note: The output of this SVC will be set to RESULT_SUCCESS if the thread resumes due to a
|
|
|
|
// signal in one of its wait objects, or to 0xC8A01836 if there was a translation error.
|
|
|
|
// By default the index is set to -1.
|
|
|
|
thread->wait_set_output = true; |
|
|
|
*index = -1; |
|
|
|
return RESULT_SUCCESS; |
|
|
|
} |
|
|
|
|