diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/os/windows.zig | 28 | ||||
| -rw-r--r-- | lib/std/os/windows/bits.zig | 3 | ||||
| -rw-r--r-- | lib/std/os/windows/kernel32.zig | 10 |
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, |
