diff options
Diffstat (limited to 'src/core/hle')
-rw-r--r-- | src/core/hle/kernel/svc.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index b7cad2248..bfe1907e3 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -131,7 +131,7 @@ static bool DefaultThreadWakeupCallback(ThreadWakeupReason reason, SharedPtr<Thr ASSERT(reason == ThreadWakeupReason::Signal); thread->SetWaitSynchronizationResult(RESULT_SUCCESS); - + thread->SetWaitSynchronizationOutput(static_cast<u32>(index)); return true; }; @@ -174,9 +174,10 @@ static ResultCode WaitSynchronization(Handle* index, VAddr handles_address, u64 if (!Memory::IsValidVirtualAddress(handles_address)) return ERR_INVALID_POINTER; - // Check if 'handle_count' is invalid - if (handle_count < 0) - return ERR_OUT_OF_RANGE; + static constexpr u64 MaxHandles = 0x40; + + if (handle_count > MaxHandles) + return ResultCode(ErrorModule::Kernel, ErrCodes::TooLarge); auto thread = GetCurrentThread(); @@ -211,9 +212,19 @@ static ResultCode WaitSynchronization(Handle* index, VAddr handles_address, u64 if (nano_seconds == 0) return RESULT_TIMEOUT; - // Just implement for a single handle for now - ASSERT(handle_count == 1); - return WaitSynchronization1(objects[0], GetCurrentThread(), nano_seconds); + for (auto& object : objects) + object->AddWaitingThread(thread); + + thread->wait_objects = std::move(objects); + 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 = DefaultThreadWakeupCallback; + + Core::System::GetInstance().PrepareReschedule(); + + return RESULT_TIMEOUT; } /// Resumes a thread waiting on WaitSynchronization |