Commit 78c0d33eb7
Changed files (3)
lib
std
os
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,