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 {...@@ -78,12 +78,12 @@ const WindowsParker = struct {
7878
79 pub fn unpark(self: *WindowsParker, ptr: *const u32) void {79 pub fn unpark(self: *WindowsParker, ptr: *const u32) void {
80 const key = @ptrCast(*const c_void, ptr);80 const key = @ptrCast(*const c_void, ptr);
81 const handle_ptr = getEventHandlePtr() orelse return;81 const handle = getEventHandle() orelse return;
8282
83 var waiting = @atomicLoad(u32, &self.waiters, .Monotonic);83 var waiting = @atomicLoad(u32, &self.waiters, .Monotonic);
84 while (waiting != 0) {84 while (waiting != 0) {
85 waiting = @cmpxchgWeak(u32, &self.waiters, waiting, waiting - 1, .Acquire, .Monotonic) orelse {85 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);
87 assert(rc == 0);87 assert(rc == 0);
88 return;88 return;
89 };89 };
...@@ -92,12 +92,13 @@ const WindowsParker = struct {...@@ -92,12 +92,13 @@ const WindowsParker = struct {
9292
93 pub fn park(self: *WindowsParker, ptr: *const u32, expected: u32) void {93 pub fn park(self: *WindowsParker, ptr: *const u32, expected: u32) void {
94 var spin = SpinLock.Backoff.init();94 var spin = SpinLock.Backoff.init();
95 const ev_handle = getEventHandle();
95 const key = @ptrCast(*const c_void, ptr);96 const key = @ptrCast(*const c_void, ptr);
96 97
97 while (@atomicLoad(u32, ptr, .Acquire) == expected) {98 while (@atomicLoad(u32, ptr, .Monotonic) == expected) {
98 if (getEventHandlePtr()) |handle_ptr| {99 if (ev_handle) |handle| {
99 _ = @atomicRmw(u32, &self.waiters, .Add, 1, .Release);100 _ = @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);
101 assert(rc == 0);102 assert(rc == 0);
102 } else {103 } else {
103 spin.yield();104 spin.yield();
...@@ -107,14 +108,15 @@ const WindowsParker = struct {...@@ -107,14 +108,15 @@ const WindowsParker = struct {
107108
108 var event_handle = std.lazyInit(windows.HANDLE);109 var event_handle = std.lazyInit(windows.HANDLE);
109110
110 fn getEventHandlePtr() ?*const windows.HANDLE {111 fn getEventHandle() ?windows.HANDLE {
111 return event_handle.get() orelse {112 if (event_handle.get()) |handle_ptr|
112 const access_mask = windows.GENERIC_READ | windows.GENERIC_WRITE;113 return handle_ptr.*;
113 if (windows.ntdll.NtCreateKeyedEvent(&event_handle.data, access_mask, null, 0) != 0)114 defer event_handle.resolve();
114 return null;115
115 event_handle.resolve();116 const access_mask = windows.GENERIC_READ | windows.GENERIC_WRITE;
116 return &event_handle.data;117 if (windows.ntdll.NtCreateKeyedEvent(&event_handle.data, access_mask, null, 0) != 0)
117 };118 return null;
119 return event_handle.data;
118 }120 }
119};121};
120122