Commit 78c0d33eb7

daurnimator <quae@daurnimator.com>
2019-11-19 06:37:29
std: add WaitForMultipleObjects for windows
1 parent 21ca54f
Changed files (3)
lib/std/os/windows/bits.zig
@@ -534,7 +534,10 @@ pub const STARTF_USESTDHANDLES = 0x00000100;
 
 pub const INFINITE = 4294967295;
 
+pub const MAXIMUM_WAIT_OBJECTS = 64;
+
 pub const WAIT_ABANDONED = 0x00000080;
+pub const WAIT_ABANDONED_0 = WAIT_ABANDONED + 0;
 pub const WAIT_OBJECT_0 = 0x00000000;
 pub const WAIT_TIMEOUT = 0x00000102;
 pub const WAIT_FAILED = 0xFFFFFFFF;
lib/std/os/windows/kernel32.zig
@@ -207,6 +207,16 @@ pub extern "kernel32" stdcallcc fn WaitForSingleObject(hHandle: HANDLE, dwMillis
 
 pub extern "kernel32" stdcallcc fn WaitForSingleObjectEx(hHandle: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL) DWORD;
 
+pub extern "kernel32" stdcallcc fn WaitForMultipleObjects(nCount: DWORD, lpHandle: [*]const HANDLE, bWaitAll:BOOL, dwMilliseconds: DWORD) DWORD;
+
+pub extern "kernel32" stdcallcc fn WaitForMultipleObjectsEx(
+    nCount: DWORD,
+    lpHandle: [*]const HANDLE,
+    bWaitAll:BOOL,
+    dwMilliseconds: DWORD,
+    bAlertable: BOOL,
+) DWORD;
+
 pub extern "kernel32" stdcallcc fn WriteFile(
     in_hFile: HANDLE,
     in_lpBuffer: [*]const u8,
lib/std/os/windows.zig
@@ -183,6 +183,34 @@ pub fn WaitForSingleObjectEx(handle: HANDLE, milliseconds: DWORD, alertable: boo
     }
 }
 
+pub fn WaitForMultipleObjectsEx(handles: []const HANDLE, waitAll: bool, milliseconds: DWORD, alertable: bool) !u32 {
+    assert(handles.len < MAXIMUM_WAIT_OBJECTS);
+    const nCount: DWORD = @intCast(DWORD, handles.len);
+    switch (kernel32.WaitForMultipleObjectsEx(
+        nCount,
+        handles.ptr,
+        @boolToInt(waitAll),
+        milliseconds,
+        @boolToInt(alertable),
+    )) {
+        WAIT_OBJECT_0...WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS => |n| {
+            const handle_index = n - WAIT_OBJECT_0;
+            assert(handle_index < nCount);
+            return handle_index;
+        },
+        WAIT_ABANDONED_0...WAIT_ABANDONED_0 + MAXIMUM_WAIT_OBJECTS => |n| {
+            const handle_index = n - WAIT_ABANDONED_0;
+            assert(handle_index < nCount);
+            return error.WaitAbandoned;
+        },
+        WAIT_TIMEOUT => return error.WaitTimeOut,
+        WAIT_FAILED => switch (kernel32.GetLastError()) {
+            else => |err| return unexpectedError(err),
+        },
+        else => return error.Unexpected,
+    }
+}
+
 pub const FindFirstFileError = error{
     FileNotFound,
     InvalidUtf8,