From 67fb4d13593fb6f940415fda2abd56c452c7a28e Mon Sep 17 00:00:00 2001 From: Marc Tiehuis Date: Thu, 11 Oct 2018 19:02:59 +1300 Subject: [PATCH] Improve time.sleep api --- std/atomic/queue.zig | 4 ++-- std/atomic/stack.zig | 4 ++-- std/event/group.zig | 2 +- std/event/rwlock.zig | 4 ++-- std/os/time.zig | 22 ++++++++++++++++------ 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/std/atomic/queue.zig b/std/atomic/queue.zig index 796120eee4..e1cadf5d1c 100644 --- a/std/atomic/queue.zig +++ b/std/atomic/queue.zig @@ -196,7 +196,7 @@ fn startPuts(ctx: *Context) u8 { var put_count: usize = puts_per_thread; var r = std.rand.DefaultPrng.init(0xdeadbeef); while (put_count != 0) : (put_count -= 1) { - std.os.time.sleep(0, 1); // let the os scheduler be our fuzz + std.os.time.sleep(1); // let the os scheduler be our fuzz const x = @bitCast(i32, r.random.scalar(u32)); const node = ctx.allocator.create(Queue(i32).Node{ .prev = undefined, @@ -214,7 +214,7 @@ fn startGets(ctx: *Context) u8 { const last = @atomicLoad(u8, &ctx.puts_done, builtin.AtomicOrder.SeqCst) == 1; while (ctx.queue.get()) |node| { - std.os.time.sleep(0, 1); // let the os scheduler be our fuzz + std.os.time.sleep(1); // let the os scheduler be our fuzz _ = @atomicRmw(isize, &ctx.get_sum, builtin.AtomicRmwOp.Add, node.data, builtin.AtomicOrder.SeqCst); _ = @atomicRmw(usize, &ctx.get_count, builtin.AtomicRmwOp.Add, 1, builtin.AtomicOrder.SeqCst); } diff --git a/std/atomic/stack.zig b/std/atomic/stack.zig index 71896c66df..b69a93733c 100644 --- a/std/atomic/stack.zig +++ b/std/atomic/stack.zig @@ -123,7 +123,7 @@ fn startPuts(ctx: *Context) u8 { var put_count: usize = puts_per_thread; var r = std.rand.DefaultPrng.init(0xdeadbeef); while (put_count != 0) : (put_count -= 1) { - std.os.time.sleep(0, 1); // let the os scheduler be our fuzz + std.os.time.sleep(1); // let the os scheduler be our fuzz const x = @bitCast(i32, r.random.scalar(u32)); const node = ctx.allocator.create(Stack(i32).Node{ .next = undefined, @@ -140,7 +140,7 @@ fn startGets(ctx: *Context) u8 { const last = @atomicLoad(u8, &ctx.puts_done, builtin.AtomicOrder.SeqCst) == 1; while (ctx.stack.pop()) |node| { - std.os.time.sleep(0, 1); // let the os scheduler be our fuzz + std.os.time.sleep(1); // let the os scheduler be our fuzz _ = @atomicRmw(isize, &ctx.get_sum, builtin.AtomicRmwOp.Add, node.data, builtin.AtomicOrder.SeqCst); _ = @atomicRmw(usize, &ctx.get_count, builtin.AtomicRmwOp.Add, 1, builtin.AtomicOrder.SeqCst); } diff --git a/std/event/group.zig b/std/event/group.zig index 0bb3298cf8..4bf8598799 100644 --- a/std/event/group.zig +++ b/std/event/group.zig @@ -151,7 +151,7 @@ async fn testGroup(loop: *Loop) void { } async fn sleepALittle(count: *usize) void { - std.os.time.sleep(0, 1000000); + std.os.time.sleep(1 * std.os.time.millisecond); _ = @atomicRmw(usize, count, AtomicRmwOp.Add, 1, AtomicOrder.SeqCst); } diff --git a/std/event/rwlock.zig b/std/event/rwlock.zig index 03f2ac702b..5d48ea893e 100644 --- a/std/event/rwlock.zig +++ b/std/event/rwlock.zig @@ -267,7 +267,7 @@ async fn writeRunner(lock: *RwLock) void { var i: usize = 0; while (i < shared_test_data.len) : (i += 1) { - std.os.time.sleep(0, 100000); + std.os.time.sleep(100 * std.os.time.microsecond); const lock_promise = async lock.acquireWrite() catch @panic("out of memory"); const handle = await lock_promise; defer handle.release(); @@ -282,7 +282,7 @@ async fn writeRunner(lock: *RwLock) void { async fn readRunner(lock: *RwLock) void { suspend; // resumed by onNextTick - std.os.time.sleep(0, 1); + std.os.time.sleep(1); var i: usize = 0; while (i < shared_test_data.len) : (i += 1) { diff --git a/std/os/time.zig b/std/os/time.zig index 795605d7a9..236111a31c 100644 --- a/std/os/time.zig +++ b/std/os/time.zig @@ -11,14 +11,16 @@ const posix = std.os.posix; pub const epoch = @import("epoch.zig"); /// Sleep for the specified duration -pub fn sleep(seconds: usize, nanoseconds: usize) void { +pub fn sleep(nanoseconds: u64) void { switch (builtin.os) { Os.linux, Os.macosx, Os.ios => { - posixSleep(@intCast(u63, seconds), @intCast(u63, nanoseconds)); + const s = nanoseconds / ns_per_s; + const ns = nanoseconds % ns_per_s; + posixSleep(@intCast(u63, s), @intCast(u63, ns)); }, Os.windows => { const ns_per_ms = ns_per_s / ms_per_s; - const milliseconds = seconds * ms_per_s + nanoseconds / ns_per_ms; + const milliseconds = nanoseconds / ns_per_ms; windows.Sleep(@intCast(windows.DWORD, milliseconds)); }, else => @compileError("Unsupported OS"), @@ -99,6 +101,14 @@ fn milliTimestampPosix() u64 { return sec_ms + nsec_ms; } +/// Multiples of a base unit (nanoseconds) +pub const nanosecond = 1; +pub const microsecond = 1000 * nanosecond; +pub const millisecond = 1000 * microsecond; +pub const second = 1000 * millisecond; +pub const minute = 60 * second; +pub const hour = 60 * minute; + /// Divisions of a second pub const ns_per_s = 1000000000; pub const us_per_s = 1000000; @@ -251,7 +261,7 @@ pub const Timer = struct { }; test "os.time.sleep" { - sleep(0, 1); + sleep(1); } test "os.time.timestamp" { @@ -259,7 +269,7 @@ test "os.time.timestamp" { const margin = 50; const time_0 = milliTimestamp(); - sleep(0, ns_per_ms); + sleep(ns_per_ms); const time_1 = milliTimestamp(); const interval = time_1 - time_0; debug.assert(interval > 0 and interval < margin); @@ -270,7 +280,7 @@ test "os.time.Timer" { const margin = ns_per_ms * 150; var timer = try Timer.start(); - sleep(0, 10 * ns_per_ms); + sleep(10 * ns_per_ms); const time_0 = timer.read(); debug.assert(time_0 > 0 and time_0 < margin);