authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-19 09:46:41-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-19 09:46:41-04:00
log751ab72a82a0edc4c5c129c6675a33d3cd57fa73
tree54ddc2a4c43b83e85293d8795fe6b21b10e889c9
parent86eb1836682cecea199748842767cf2d9cc2ea62

std: fix os.sleep on darwin and windows


5 files changed, 35 insertions(+), 4 deletions(-)

std/c/index.zig+1
......@@ -40,3 +40,4 @@ pub extern "c" fn readlink(noalias path: &const u8, noalias buf: &u8, bufsize: u
4040pub extern "c" fn realpath(noalias file_name: &const u8, noalias resolved_name: &u8) -> ?&u8;
4141pub extern "c" fn sigprocmask(how: c_int, noalias set: &const sigset_t, noalias oset: ?&sigset_t) -> c_int;
4242pub extern "c" fn sigaction(sig: c_int, noalias act: &const Sigaction, noalias oact: ?&Sigaction) -> c_int;
43pub extern "c" fn nanosleep(rqtp: &const timespec, rmtp: ?&timespec) -> c_int;
std/os/darwin.zig+6
......@@ -221,6 +221,10 @@ pub fn readlink(noalias path: &const u8, noalias buf_ptr: &u8, buf_len: usize) -
221221 errnoWrap(c.readlink(path, buf_ptr, buf_len))
222222}
223223
224pub fn nanosleep(req: &const timespec, rem: ?&timespec) -> usize {
225 errnoWrap(c.nanosleep(req, rem))
226}
227
224228pub fn realpath(noalias filename: &const u8, noalias resolved_name: &u8) -> usize {
225229 if (c.realpath(filename, resolved_name) == null) @bitCast(usize, -isize(*c._errno())) else 0
226230}
......@@ -255,6 +259,8 @@ pub fn sigaction(sig: u5, noalias act: &const Sigaction, noalias oact: ?&Sigacti
255259pub const sigset_t = c.sigset_t;
256260pub const empty_sigset = sigset_t(0);
257261
262pub const timespec = c.timespec;
263
258264/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
259265pub const Sigaction = struct {
260266 handler: extern fn(i32),
std/os/index.zig+24-2
......@@ -949,7 +949,21 @@ pub fn readLink(allocator: &Allocator, pathname: []const u8) -> %[]u8 {
949949 }
950950}
951951
952pub fn sleep(seconds: u64, nanoseconds: u64) {
952pub fn sleep(seconds: usize, nanoseconds: usize) {
953 switch(builtin.os) {
954 Os.linux, Os.darwin, Os.macosx, Os.ios => {
955 posixSleep(u63(seconds), u63(nanoseconds));
956 },
957 Os.windows => {
958 const milliseconds = seconds * 1000 + nanoseconds / 1000000;
959 windows.Sleep(windows.DWORD(milliseconds));
960 },
961 else => @compileError("Unsupported OS"),
962 }
963}
964
965const u63 = @IntType(false, 63);
966pub fn posixSleep(seconds: u63, nanoseconds: u63) {
953967 var req = posix.timespec {
954968 .tv_sec = seconds,
955969 .tv_nsec = nanoseconds,
......@@ -961,7 +975,11 @@ pub fn sleep(seconds: u64, nanoseconds: u64) {
961975 if (err == 0) return;
962976 switch (err) {
963977 posix.EFAULT => unreachable,
964 posix.EINVAL => unreachable,
978 posix.EINVAL => {
979 // Sometimes Darwin returns EINVAL for no reason.
980 // We treat it as a spurious wakeup.
981 return;
982 },
965983 posix.EINTR => {
966984 req = rem;
967985 continue;
......@@ -970,3 +988,7 @@ pub fn sleep(seconds: u64, nanoseconds: u64) {
970988 }
971989 }
972990}
991
992test "os.sleep" {
993 sleep(0, 1);
994}
std/os/linux_x86_64.zig+2-2
......@@ -484,6 +484,6 @@ pub const Stat = extern struct {
484484};
485485
486486pub const timespec = extern struct {
487 tv_sec: usize,
488 tv_nsec: usize,
487 tv_sec: isize,
488 tv_nsec: isize,
489489};
std/os/windows/index.zig+2
......@@ -37,6 +37,8 @@ pub extern "kernel32" stdcallcc fn WriteFile(in_hFile: HANDLE, in_lpBuffer: &con
3737 in_nNumberOfBytesToWrite: DWORD, out_lpNumberOfBytesWritten: ?&DWORD,
3838 in_out_lpOverlapped: ?&OVERLAPPED) -> BOOL;
3939
40pub extern "kernel32" stdcallcc fn Sleep(dwMilliseconds: DWORD);
41
4042pub const PROV_RSA_FULL = 1;
4143
4244pub const UNICODE = false;