diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-05-27 14:41:13 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-05-27 14:41:13 -0400 |
| commit | b3dc1c380d3510a4c1d28286fe4d345c1e307d58 (patch) | |
| tree | f9c7bf6615e58aacf297c241bf7599e56933a33c /std | |
| parent | 13265cf7c785250fde12b22b5e748258d9b98afd (diff) | |
| download | zig-b3dc1c380d3510a4c1d28286fe4d345c1e307d58.tar.gz zig-b3dc1c380d3510a4c1d28286fe4d345c1e307d58.zip | |
use close$NOCANCEL on darwin
Diffstat (limited to 'std')
| -rw-r--r-- | std/c.zig | 1 | ||||
| -rw-r--r-- | std/os.zig | 10 |
2 files changed, 8 insertions, 3 deletions
@@ -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))) { |
