authorgravatar for jeremy@jeremyhuffman.comJeremy Huffman <jeremy@jeremyhuffman.com> 2020-11-06 14:01:52-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-11-06 14:01:52-05:00
log9f1639a6bbedf44dc920f1c53f1eda11d22f4e34
treed2bcaa523f58377379b6b59e84d847bae3b56cc1
parenta9e09a8be4ff6a15dabb1362a6833e6b0af66b22
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Fix std.ResetEvent.timedWait on darwin/macOS. (#6914)


1 files changed, 21 insertions(+), 1 deletions(-)

lib/std/reset_event.zig+21-1
...@@ -158,7 +158,7 @@ const PosixEvent = struct {...@@ -158,7 +158,7 @@ const PosixEvent = struct {
158 var tv: os.darwin.timeval = undefined;158 var tv: os.darwin.timeval = undefined;
159 assert(os.darwin.gettimeofday(&tv, null) == 0);159 assert(os.darwin.gettimeofday(&tv, null) == 0);
160 timeout_abs += @intCast(u64, tv.tv_sec) * time.ns_per_s;160 timeout_abs += @intCast(u64, tv.tv_sec) * time.ns_per_s;
161 timeout_abs += @intCast(u64, tv.tv_usec) * time.us_per_s;161 timeout_abs += @intCast(u64, tv.tv_usec) * time.ns_per_us;
162 } else {162 } else {
163 os.clock_gettime(os.CLOCK_REALTIME, &ts) catch unreachable;163 os.clock_gettime(os.CLOCK_REALTIME, &ts) catch unreachable;
164 timeout_abs += @intCast(u64, ts.tv_sec) * time.ns_per_s;164 timeout_abs += @intCast(u64, ts.tv_sec) * time.ns_per_s;
...@@ -431,6 +431,20 @@ test "std.ResetEvent" {...@@ -431,6 +431,20 @@ test "std.ResetEvent" {
431 self.in.wait();431 self.in.wait();
432 assert(self.value == 3);432 assert(self.value == 3);
433 }433 }
434
435 fn sleeper(self: *Self) void {
436 self.in.set();
437 time.sleep(time.ns_per_ms * 2);
438 self.value = 5;
439 self.out.set();
440 }
441
442 fn timedWaiter(self: *Self) !void {
443 self.in.wait();
444 testing.expectError(error.TimedOut, self.out.timedWait(time.ns_per_us));
445 try self.out.timedWait(time.ns_per_ms * 10);
446 testing.expect(self.value == 5);
447 }
434 };448 };
435449
436 var context = Context.init();450 var context = Context.init();
...@@ -438,4 +452,10 @@ test "std.ResetEvent" {...@@ -438,4 +452,10 @@ test "std.ResetEvent" {
438 const receiver = try std.Thread.spawn(&context, Context.receiver);452 const receiver = try std.Thread.spawn(&context, Context.receiver);
439 defer receiver.wait();453 defer receiver.wait();
440 context.sender();454 context.sender();
455
456 var timed = Context.init();
457 defer timed.deinit();
458 const sleeper = try std.Thread.spawn(&timed, Context.sleeper);
459 defer sleeper.wait();
460 try timed.timedWaiter();
441}461}