|
@@ -164,10 +164,30 @@ static ResultCode WaitSynchronization1(
|
|
|
|
|
|
|
|
/// Wait for the given handles to synchronize, timeout after the specified nanoseconds
|
|
/// Wait for the given handles to synchronize, timeout after the specified nanoseconds
|
|
|
static ResultCode WaitSynchronization(VAddr handles_address, u64 handle_count, s64 nano_seconds) {
|
|
static ResultCode WaitSynchronization(VAddr handles_address, u64 handle_count, s64 nano_seconds) {
|
|
|
- LOG_WARNING(Kernel_SVC,
|
|
|
|
|
- "(STUBBED) called handles_address=0x%llx, handle_count=%d, nano_seconds=%d",
|
|
|
|
|
- handles_address, handle_count, nano_seconds);
|
|
|
|
|
- return RESULT_SUCCESS;
|
|
|
|
|
|
|
+ LOG_TRACE(Kernel_SVC, "called handles_address=0x%llx, handle_count=%d, nano_seconds=%d",
|
|
|
|
|
+ handles_address, handle_count, nano_seconds);
|
|
|
|
|
+
|
|
|
|
|
+ if (!Memory::IsValidVirtualAddress(handles_address))
|
|
|
|
|
+ return ERR_INVALID_POINTER;
|
|
|
|
|
+
|
|
|
|
|
+ // Check if 'handle_count' is invalid
|
|
|
|
|
+ if (handle_count < 0)
|
|
|
|
|
+ return ERR_OUT_OF_RANGE;
|
|
|
|
|
+
|
|
|
|
|
+ using ObjectPtr = SharedPtr<WaitObject>;
|
|
|
|
|
+ std::vector<ObjectPtr> objects(handle_count);
|
|
|
|
|
+
|
|
|
|
|
+ for (int i = 0; i < handle_count; ++i) {
|
|
|
|
|
+ Handle handle = Memory::Read32(handles_address + i * sizeof(Handle));
|
|
|
|
|
+ auto object = g_handle_table.Get<WaitObject>(handle);
|
|
|
|
|
+ if (object == nullptr)
|
|
|
|
|
+ return ERR_INVALID_HANDLE;
|
|
|
|
|
+ objects[i] = object;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Just implement for a single handle for now
|
|
|
|
|
+ ASSERT(handle_count == 1);
|
|
|
|
|
+ return WaitSynchronization1(objects[0], GetCurrentThread(), nano_seconds);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// Attempts to locks a mutex, creating it if it does not already exist
|
|
/// Attempts to locks a mutex, creating it if it does not already exist
|