Commit e2189b6e5d

kprotty <kbutcher6200@gmail.com>
2019-11-08 02:37:53
cleanup getEventHandle
1 parent 4390001
Changed files (1)
lib
lib/std/parker.zig
@@ -78,12 +78,12 @@ const WindowsParker = struct {
 
     pub fn unpark(self: *WindowsParker, ptr: *const u32) void {
         const key = @ptrCast(*const c_void, ptr);
-        const handle_ptr = getEventHandlePtr() orelse return;
+        const handle = getEventHandle() orelse return;
 
         var waiting = @atomicLoad(u32, &self.waiters, .Monotonic);
         while (waiting != 0) {
             waiting = @cmpxchgWeak(u32, &self.waiters, waiting, waiting - 1, .Acquire, .Monotonic) orelse {
-                const rc = windows.ntdll.NtReleaseKeyedEvent(handle_ptr.*, key, windows.FALSE, null);
+                const rc = windows.ntdll.NtReleaseKeyedEvent(handle, key, windows.FALSE, null);
                 assert(rc == 0);
                 return;
             };
@@ -92,12 +92,13 @@ const WindowsParker = struct {
 
     pub fn park(self: *WindowsParker, ptr: *const u32, expected: u32) void {
         var spin = SpinLock.Backoff.init();
+        const ev_handle = getEventHandle();
         const key = @ptrCast(*const c_void, ptr);
         
-        while (@atomicLoad(u32, ptr, .Acquire) == expected) {
-            if (getEventHandlePtr()) |handle_ptr| {
+        while (@atomicLoad(u32, ptr, .Monotonic) == expected) {
+            if (ev_handle) |handle| {
                 _ = @atomicRmw(u32, &self.waiters, .Add, 1, .Release);
-                const rc = windows.ntdll.NtWaitForKeyedEvent(handle_ptr.*, key, windows.FALSE, null);
+                const rc = windows.ntdll.NtWaitForKeyedEvent(handle, key, windows.FALSE, null);
                 assert(rc == 0);
             } else {
                 spin.yield();
@@ -107,14 +108,15 @@ const WindowsParker = struct {
 
     var event_handle = std.lazyInit(windows.HANDLE);
 
-    fn getEventHandlePtr() ?*const windows.HANDLE {
-        return event_handle.get() orelse {
-            const access_mask = windows.GENERIC_READ | windows.GENERIC_WRITE;
-            if (windows.ntdll.NtCreateKeyedEvent(&event_handle.data, access_mask, null, 0) != 0)
-                return null;
-            event_handle.resolve();
-            return &event_handle.data;
-        };
+    fn getEventHandle() ?windows.HANDLE {
+        if (event_handle.get()) |handle_ptr|
+            return handle_ptr.*;
+        defer event_handle.resolve();
+
+        const access_mask = windows.GENERIC_READ | windows.GENERIC_WRITE;
+        if (windows.ntdll.NtCreateKeyedEvent(&event_handle.data, access_mask, null, 0) != 0)
+            return null;
+        return event_handle.data;
     }
 };