aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/std/os/windows.zig28
-rw-r--r--lib/std/os/windows/bits.zig3
-rw-r--r--lib/std/os/windows/kernel32.zig10
3 files changed, 41 insertions, 0 deletions
diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig
index 2f51fc67a8..593a9ec29f 100644
--- a/lib/std/os/windows.zig
+++ b/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,
diff --git a/lib/std/os/windows/bits.zig b/lib/std/os/windows/bits.zig
index aa478fbe5b..23dd80141a 100644
--- a/lib/std/os/windows/bits.zig
+++ b/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;
diff --git a/lib/std/os/windows/kernel32.zig b/lib/std/os/windows/kernel32.zig
index 3f14196d11..748d9e25fa 100644
--- a/lib/std/os/windows/kernel32.zig
+++ b/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,