authorgravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2019-11-19 16:37:29+11:00
committergravatar for quae@daurnimator.comdaurnimator <quae@daurnimator.com> 2019-11-27 13:01:02+11:00
log78c0d33eb75ed7985df39607cf0e0d2ae94ef98a
tree24e20c05f80086268be53b8a739479df59bbe8b8
parent21ca54f56013897573ba5aeb67d946deaa162200
signature Commit is signed but in an unrecognized format.

std: add WaitForMultipleObjects for windows


3 files changed, 41 insertions(+), 0 deletions(-)

lib/std/os/windows.zig+28
...@@ -183,6 +183,34 @@ pub fn WaitForSingleObjectEx(handle: HANDLE, milliseconds: DWORD, alertable: boo...@@ -183,6 +183,34 @@ pub fn WaitForSingleObjectEx(handle: HANDLE, milliseconds: DWORD, alertable: boo
183 }183 }
184}184}
185185
186pub fn WaitForMultipleObjectsEx(handles: []const HANDLE, waitAll: bool, milliseconds: DWORD, alertable: bool) !u32 {
187 assert(handles.len < MAXIMUM_WAIT_OBJECTS);
188 const nCount: DWORD = @intCast(DWORD, handles.len);
189 switch (kernel32.WaitForMultipleObjectsEx(
190 nCount,
191 handles.ptr,
192 @boolToInt(waitAll),
193 milliseconds,
194 @boolToInt(alertable),
195 )) {
196 WAIT_OBJECT_0...WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS => |n| {
197 const handle_index = n - WAIT_OBJECT_0;
198 assert(handle_index < nCount);
199 return handle_index;
200 },
201 WAIT_ABANDONED_0...WAIT_ABANDONED_0 + MAXIMUM_WAIT_OBJECTS => |n| {
202 const handle_index = n - WAIT_ABANDONED_0;
203 assert(handle_index < nCount);
204 return error.WaitAbandoned;
205 },
206 WAIT_TIMEOUT => return error.WaitTimeOut,
207 WAIT_FAILED => switch (kernel32.GetLastError()) {
208 else => |err| return unexpectedError(err),
209 },
210 else => return error.Unexpected,
211 }
212}
213
186pub const FindFirstFileError = error{214pub const FindFirstFileError = error{
187 FileNotFound,215 FileNotFound,
188 InvalidUtf8,216 InvalidUtf8,
lib/std/os/windows/bits.zig+3
...@@ -534,7 +534,10 @@ pub const STARTF_USESTDHANDLES = 0x00000100;...@@ -534,7 +534,10 @@ pub const STARTF_USESTDHANDLES = 0x00000100;
534534
535pub const INFINITE = 4294967295;535pub const INFINITE = 4294967295;
536536
537pub const MAXIMUM_WAIT_OBJECTS = 64;
538
537pub const WAIT_ABANDONED = 0x00000080;539pub const WAIT_ABANDONED = 0x00000080;
540pub const WAIT_ABANDONED_0 = WAIT_ABANDONED + 0;
538pub const WAIT_OBJECT_0 = 0x00000000;541pub const WAIT_OBJECT_0 = 0x00000000;
539pub const WAIT_TIMEOUT = 0x00000102;542pub const WAIT_TIMEOUT = 0x00000102;
540pub const WAIT_FAILED = 0xFFFFFFFF;543pub const WAIT_FAILED = 0xFFFFFFFF;
lib/std/os/windows/kernel32.zig+10
...@@ -207,6 +207,16 @@ pub extern "kernel32" stdcallcc fn WaitForSingleObject(hHandle: HANDLE, dwMillis...@@ -207,6 +207,16 @@ pub extern "kernel32" stdcallcc fn WaitForSingleObject(hHandle: HANDLE, dwMillis
207207
208pub extern "kernel32" stdcallcc fn WaitForSingleObjectEx(hHandle: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL) DWORD;208pub extern "kernel32" stdcallcc fn WaitForSingleObjectEx(hHandle: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL) DWORD;
209209
210pub extern "kernel32" stdcallcc fn WaitForMultipleObjects(nCount: DWORD, lpHandle: [*]const HANDLE, bWaitAll:BOOL, dwMilliseconds: DWORD) DWORD;
211
212pub extern "kernel32" stdcallcc fn WaitForMultipleObjectsEx(
213 nCount: DWORD,
214 lpHandle: [*]const HANDLE,
215 bWaitAll:BOOL,
216 dwMilliseconds: DWORD,
217 bAlertable: BOOL,
218) DWORD;
219
210pub extern "kernel32" stdcallcc fn WriteFile(220pub extern "kernel32" stdcallcc fn WriteFile(
211 in_hFile: HANDLE,221 in_hFile: HANDLE,
212 in_lpBuffer: [*]const u8,222 in_lpBuffer: [*]const u8,