From b3dc1c380d3510a4c1d28286fe4d345c1e307d58 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 27 May 2019 14:41:13 -0400 Subject: [PATCH] use close$NOCANCEL on darwin --- std/c.zig | 1 + std/os.zig | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/std/c.zig b/std/c.zig index 90d8f0056e..bffb8a9bd3 100644 --- a/std/c.zig +++ b/std/c.zig @@ -32,6 +32,7 @@ pub extern "c" fn abort() noreturn; pub extern "c" fn exit(code: c_int) noreturn; pub extern "c" fn isatty(fd: fd_t) c_int; pub extern "c" fn close(fd: fd_t) c_int; +pub extern "c" fn @"close$NOCANCEL"(fd: fd_t) c_int; pub extern "c" fn fstat(fd: fd_t, buf: *Stat) c_int; pub extern "c" fn @"fstat$INODE64"(fd: fd_t, buf: *Stat) c_int; pub extern "c" fn lseek(fd: fd_t, offset: isize, whence: c_int) isize; diff --git a/std/os.zig b/std/os.zig index 3c18498a64..a181f58ac2 100644 --- a/std/os.zig +++ b/std/os.zig @@ -74,9 +74,13 @@ pub fn close(fd: fd_t) void { return windows.CloseHandle(fd); } if (wasi.is_the_target) { - switch (wasi.fd_close(fd)) { - 0 => return, - else => |err| return unexpectedErrno(err), + _ = wasi.fd_close(fd); + } + if (darwin.is_the_target) { + // This avoids the EINTR problem. + switch (darwin.getErrno(darwin.@"close$NOCANCEL"(fd))) { + EBADF => unreachable, // Always a race condition. + else => return, } } switch (errno(system.close(fd))) {