zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit b0dcce93f7fca9ee4f8e4f2c0a34523b91b50c46 (tree)
parent a6af55cc6e81dd09e03d4b87e8079ce1fe57a36c
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Tue, 26 Nov 2024 00:36:33 -0500

Merge pull request #22075 from ziglang/fix-broken-pipe

std.io.Poller: handle EPIPE as EOF
Diffstat:
M.github/workflows/ci.yaml | 2+-
MCMakeLists.txt | 7+------
Mlib/std/Target.zig | 2+-
Mlib/std/io.zig | 5++++-
Mlib/std/process/Child.zig | 23++++++++++-------------
5 files changed, 17 insertions(+), 22 deletions(-)

diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml @@ -46,7 +46,7 @@ jobs: - name: Build and Test run: sh ci/aarch64-linux-release.sh x86_64-macos-release: - runs-on: "macos-12" + runs-on: "macos-13" env: ARCH: "x86_64" steps: diff --git a/CMakeLists.txt b/CMakeLists.txt @@ -89,12 +89,7 @@ set(ZIG_SHARED_LLVM off CACHE BOOL "Prefer linking against shared LLVM libraries set(ZIG_STATIC_LLVM ${ZIG_STATIC} CACHE BOOL "Prefer linking against static LLVM libraries") set(ZIG_STATIC_ZLIB ${ZIG_STATIC} CACHE BOOL "Prefer linking against static zlib") set(ZIG_STATIC_ZSTD ${ZIG_STATIC} CACHE BOOL "Prefer linking against static zstd") -if(APPLE AND ZIG_STATIC) - set(ZIG_STATIC_CURSES on) -else() - set(ZIG_STATIC_CURSES off) -endif() -set(ZIG_STATIC_CURSES ${ZIG_STATIC_CURSES} CACHE BOOL "Prefer linking against static curses") +set(ZIG_STATIC_CURSES OFF CACHE BOOL "Enable static linking against curses") if (ZIG_SHARED_LLVM AND ZIG_STATIC_LLVM) message(SEND_ERROR "-DZIG_SHARED_LLVM and -DZIG_STATIC_LLVM cannot both be enabled simultaneously") diff --git a/lib/std/Target.zig b/lib/std/Target.zig @@ -531,7 +531,7 @@ pub const Os = struct { }, .macos => .{ .semver = .{ - .min = .{ .major = 11, .minor = 7, .patch = 1 }, + .min = .{ .major = 13, .minor = 0, .patch = 0 }, .max = .{ .major = 15, .minor = 2, .patch = 0 }, }, }, diff --git a/lib/std/io.zig b/lib/std/io.zig @@ -646,7 +646,10 @@ pub fn Poller(comptime StreamEnum: type) type { // always check if there's some data waiting to be read first. if (poll_fd.revents & posix.POLL.IN != 0) { const buf = try q.writableWithSize(bump_amt); - const amt = try posix.read(poll_fd.fd, buf); + const amt = posix.read(poll_fd.fd, buf) catch |err| switch (err) { + error.BrokenPipe => 0, // Handle the same as EOF. + else => |e| return e, + }; q.update(amt); if (amt == 0) { // Remove the fd when the EOF condition is met. diff --git a/lib/std/process/Child.zig b/lib/std/process/Child.zig @@ -293,19 +293,16 @@ pub fn killPosix(self: *ChildProcess) !Term { error.ProcessNotFound => return error.AlreadyTerminated, else => return err, }; - try self.waitUnwrapped(); + self.waitUnwrapped(); return self.term.?; } -/// Blocks until child process terminates and then cleans up all resources. -pub fn wait(self: *ChildProcess) !Term { - const term = if (native_os == .windows) - try self.waitWindows() - else - try self.waitPosix(); +pub const WaitError = SpawnError || std.os.windows.GetProcessMemoryInfoError; +/// Blocks until child process terminates and then cleans up all resources. +pub fn wait(self: *ChildProcess) WaitError!Term { + const term = if (native_os == .windows) try self.waitWindows() else self.waitPosix(); self.id = undefined; - return term; } @@ -408,7 +405,7 @@ pub fn run(args: struct { }; } -fn waitWindows(self: *ChildProcess) !Term { +fn waitWindows(self: *ChildProcess) WaitError!Term { if (self.term) |term| { self.cleanupStreams(); return term; @@ -418,17 +415,17 @@ fn waitWindows(self: *ChildProcess) !Term { return self.term.?; } -fn waitPosix(self: *ChildProcess) !Term { +fn waitPosix(self: *ChildProcess) SpawnError!Term { if (self.term) |term| { self.cleanupStreams(); return term; } - try self.waitUnwrapped(); + self.waitUnwrapped(); return self.term.?; } -fn waitUnwrappedWindows(self: *ChildProcess) !void { +fn waitUnwrappedWindows(self: *ChildProcess) WaitError!void { const result = windows.WaitForSingleObjectEx(self.id, windows.INFINITE, false); self.term = @as(SpawnError!Term, x: { @@ -450,7 +447,7 @@ fn waitUnwrappedWindows(self: *ChildProcess) !void { return result; } -fn waitUnwrapped(self: *ChildProcess) !void { +fn waitUnwrapped(self: *ChildProcess) void { const res: posix.WaitPidResult = res: { if (self.request_resource_usage_statistics) { switch (native_os) {