Przeglądaj źródła

svc: Implement WaitSynchronization for a single handle.

bunnei 8 lat temu
rodzic
commit
0e978bdd50
1 zmienionych plików z 24 dodań i 4 usunięć
  1. 24 4
      src/core/hle/kernel/svc.cpp

+ 24 - 4
src/core/hle/kernel/svc.cpp

@@ -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