authorgravatar for kbutcher6200@gmail.comkprotty <kbutcher6200@gmail.com> 2019-11-07 19:37:53-06:00
committergravatar for kbutcher6200@gmail.comkprotty <kbutcher6200@gmail.com> 2019-11-07 19:37:53-06:00
loge2189b6e5d5a5644eb937b682cdfe4e658fe27e8
tree6e1e67b5fe547b4e07f7a5c82bed135db909027d
parent43900011f7379e61564196141a687a2b8352d27f

cleanup getEventHandle


1 files changed, 15 insertions(+), 13 deletions(-)

lib/std/parker.zig+15-13
......@@ -78,12 +78,12 @@ const WindowsParker = struct {
7878
7979 pub fn unpark(self: *WindowsParker, ptr: *const u32) void {
8080 const key = @ptrCast(*const c_void, ptr);
81 const handle_ptr = getEventHandlePtr() orelse return;
81 const handle = getEventHandle() orelse return;
8282
8383 var waiting = @atomicLoad(u32, &self.waiters, .Monotonic);
8484 while (waiting != 0) {
8585 waiting = @cmpxchgWeak(u32, &self.waiters, waiting, waiting - 1, .Acquire, .Monotonic) orelse {
86 const rc = windows.ntdll.NtReleaseKeyedEvent(handle_ptr.*, key, windows.FALSE, null);
86 const rc = windows.ntdll.NtReleaseKeyedEvent(handle, key, windows.FALSE, null);
8787 assert(rc == 0);
8888 return;
8989 };
......@@ -92,12 +92,13 @@ const WindowsParker = struct {
9292
9393 pub fn park(self: *WindowsParker, ptr: *const u32, expected: u32) void {
9494 var spin = SpinLock.Backoff.init();
95 const ev_handle = getEventHandle();
9596 const key = @ptrCast(*const c_void, ptr);
9697
97 while (@atomicLoad(u32, ptr, .Acquire) == expected) {
98 if (getEventHandlePtr()) |handle_ptr| {
98 while (@atomicLoad(u32, ptr, .Monotonic) == expected) {
99 if (ev_handle) |handle| {
99100 _ = @atomicRmw(u32, &self.waiters, .Add, 1, .Release);
100 const rc = windows.ntdll.NtWaitForKeyedEvent(handle_ptr.*, key, windows.FALSE, null);
101 const rc = windows.ntdll.NtWaitForKeyedEvent(handle, key, windows.FALSE, null);
101102 assert(rc == 0);
102103 } else {
103104 spin.yield();
......@@ -107,14 +108,15 @@ const WindowsParker = struct {
107108
108109 var event_handle = std.lazyInit(windows.HANDLE);
109110
110 fn getEventHandlePtr() ?*const windows.HANDLE {
111 return event_handle.get() orelse {
112 const access_mask = windows.GENERIC_READ | windows.GENERIC_WRITE;
113 if (windows.ntdll.NtCreateKeyedEvent(&event_handle.data, access_mask, null, 0) != 0)
114 return null;
115 event_handle.resolve();
116 return &event_handle.data;
117 };
111 fn getEventHandle() ?windows.HANDLE {
112 if (event_handle.get()) |handle_ptr|
113 return handle_ptr.*;
114 defer event_handle.resolve();
115
116 const access_mask = windows.GENERIC_READ | windows.GENERIC_WRITE;
117 if (windows.ntdll.NtCreateKeyedEvent(&event_handle.data, access_mask, null, 0) != 0)
118 return null;
119 return event_handle.data;
118120 }
119121};
120122