authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-21 19:44:16-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-23 13:36:21-08:00
log485ec0884ff81a23ca5460a6d07d4e2c2d6b81cb
treee8bee5df6899140f7aefd29834bf6d41d264896d
parenta368c0d099a4eb43e9794d3c458a051e89a6d82e

restore std.ResetEvent.isSet functionality


2 files changed, 27 insertions(+), 0 deletions(-)

lib/std/c.zig+1
...@@ -276,6 +276,7 @@ pub extern "c" fn sem_post(sem: *sem_t) c_int;...@@ -276,6 +276,7 @@ pub extern "c" fn sem_post(sem: *sem_t) c_int;
276pub extern "c" fn sem_wait(sem: *sem_t) c_int;276pub extern "c" fn sem_wait(sem: *sem_t) c_int;
277pub extern "c" fn sem_trywait(sem: *sem_t) c_int;277pub extern "c" fn sem_trywait(sem: *sem_t) c_int;
278pub extern "c" fn sem_timedwait(sem: *sem_t, abs_timeout: *const timespec) c_int;278pub extern "c" fn sem_timedwait(sem: *sem_t, abs_timeout: *const timespec) c_int;
279pub extern "c" fn sem_getvalue(sem: *sem_t, sval: *c_int) c_int;
279280
280pub extern "c" fn kqueue() c_int;281pub extern "c" fn kqueue() c_int;
281pub extern "c" fn kevent(282pub extern "c" fn kevent(
lib/std/reset_event.zig+26
...@@ -34,6 +34,14 @@ pub const ResetEvent = struct {...@@ -34,6 +34,14 @@ pub const ResetEvent = struct {
34 self.os_event.deinit();34 self.os_event.deinit();
35 }35 }
3636
37 /// When `wait` would return without blocking, this returns `true`.
38 /// Note that the value may be immediately invalid upon this function's
39 /// return, because another thread may call `wait` in between, changing
40 /// the event's set/cleared status.
41 pub fn isSet(self: *ResetEvent) bool {
42 return self.os_event.isSet();
43 }
44
37 /// Sets the event if not already set and45 /// Sets the event if not already set and
38 /// wakes up all the threads waiting on the event.46 /// wakes up all the threads waiting on the event.
39 pub fn set(self: *ResetEvent) void {47 pub fn set(self: *ResetEvent) void {
...@@ -77,6 +85,10 @@ const DebugEvent = struct {...@@ -77,6 +85,10 @@ const DebugEvent = struct {
77 self.* = undefined;85 self.* = undefined;
78 }86 }
7987
88 fn isSet(self: *DebugEvent) bool {
89 return self.is_set;
90 }
91
80 fn reset(self: *DebugEvent) void {92 fn reset(self: *DebugEvent) void {
81 self.is_set = false;93 self.is_set = false;
82 }94 }
...@@ -122,6 +134,13 @@ const PosixEvent = struct {...@@ -122,6 +134,13 @@ const PosixEvent = struct {
122 self.* = undefined;134 self.* = undefined;
123 }135 }
124136
137 fn isSet(self: *PosixEvent) bool {
138 const sem = self.getInitializedSem();
139 var val: c_int = undefined;
140 assert(c.sem_getvalue(sem, &val) == 0);
141 return val > 0;
142 }
143
125 fn reset(self: *PosixEvent) void {144 fn reset(self: *PosixEvent) void {
126 const sem = self.getInitializedSem();145 const sem = self.getInitializedSem();
127 while (true) {146 while (true) {
...@@ -208,6 +227,10 @@ const AtomicEvent = struct {...@@ -208,6 +227,10 @@ const AtomicEvent = struct {
208 self.* = undefined;227 self.* = undefined;
209 }228 }
210229
230 fn isSet(self: *const AtomicEvent) bool {
231 return @atomicLoad(u32, &self.waiters, .Acquire) == WAKE;
232 }
233
211 fn reset(self: *AtomicEvent) void {234 fn reset(self: *AtomicEvent) void {
212 @atomicStore(u32, &self.waiters, 0, .Monotonic);235 @atomicStore(u32, &self.waiters, 0, .Monotonic);
213 }236 }
...@@ -374,10 +397,13 @@ test "ResetEvent" {...@@ -374,10 +397,13 @@ test "ResetEvent" {
374 defer event.deinit();397 defer event.deinit();
375398
376 // test event setting399 // test event setting
400 testing.expect(!event.isSet());
377 event.set();401 event.set();
402 testing.expect(event.isSet());
378403
379 // test event resetting404 // test event resetting
380 event.reset();405 event.reset();
406 testing.expect(!event.isSet());
381407
382 // test event waiting (non-blocking)408 // test event waiting (non-blocking)
383 event.set();409 event.set();