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

This commit is contained in:
Jeremy Huffman 2020-11-06 14:01:52 -05:00 committed by GitHub
parent a9e09a8be4
commit 9f1639a6bb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -158,7 +158,7 @@ const PosixEvent = struct {
var tv: os.darwin.timeval = undefined;
assert(os.darwin.gettimeofday(&tv, null) == 0);
timeout_abs += @intCast(u64, tv.tv_sec) * time.ns_per_s;
timeout_abs += @intCast(u64, tv.tv_usec) * time.us_per_s;
timeout_abs += @intCast(u64, tv.tv_usec) * time.ns_per_us;
} else {
os.clock_gettime(os.CLOCK_REALTIME, &ts) catch unreachable;
timeout_abs += @intCast(u64, ts.tv_sec) * time.ns_per_s;
@ -431,6 +431,20 @@ test "std.ResetEvent" {
self.in.wait();
assert(self.value == 3);
}
fn sleeper(self: *Self) void {
self.in.set();
time.sleep(time.ns_per_ms * 2);
self.value = 5;
self.out.set();
}
fn timedWaiter(self: *Self) !void {
self.in.wait();
testing.expectError(error.TimedOut, self.out.timedWait(time.ns_per_us));
try self.out.timedWait(time.ns_per_ms * 10);
testing.expect(self.value == 5);
}
};
var context = Context.init();
@ -438,4 +452,10 @@ test "std.ResetEvent" {
const receiver = try std.Thread.spawn(&context, Context.receiver);
defer receiver.wait();
context.sender();
var timed = Context.init();
defer timed.deinit();
const sleeper = try std.Thread.spawn(&timed, Context.sleeper);
defer sleeper.wait();
try timed.timedWaiter();
}