Something went wrong. Try again.
atproto relay in zig zlay.waow.tech
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950//! socket helpers that hold on every std.Io backend.
const std = @import("std");const Io = std.Io;const backend_config = @import("backend_config");const zio = @import("zio");
/// end a connection that another fiber may be parked on. half-closes the/// socket so the parked side wakes with EOF and closes the descriptor itself./// closing it from here instead trips an assert in zio's epoll/kqueue backends/// and, under io_uring, leaves the parked fiber asleep.pub fn interrupt(io: Io, stream: Io.net.Stream) void { stream.shutdown(io, .both) catch {};}
fn parkedReader(io: Io, stream: Io.net.Stream, woke_with_eof: *std.atomic.Value(bool)) void { var buf: [16]u8 = undefined; var reader = stream.reader(io, &buf); _ = reader.interface.takeByte() catch |err| { woke_with_eof.store(err == error.EndOfStream, .release); };}
fn expectInterruptWakesReader(io: Io) !void { var listener = try (Io.net.IpAddress{ .ip4 = .loopback(0) }).listen(io, .{}); defer listener.deinit(io); const client = try listener.socket.address.connect(io, .{ .mode = .stream }); defer client.close(io); const served = try listener.accept(io);
var woke_with_eof: std.atomic.Value(bool) = .init(false); var reader = try io.concurrent(parkedReader, .{ io, served, &woke_with_eof }); try io.sleep(.fromMilliseconds(50), .awake);
interrupt(io, served); reader.await(io); served.close(io); try std.testing.expect(woke_with_eof.load(.acquire));}
test "interrupt wakes a reader parked on the socket" { if (comptime backend_config.use_zio) { const rt = try zio.Runtime.init(std.testing.allocator, .{ .executors = .exact(2) }); defer rt.deinit(); try expectInterruptWakesReader(rt.io()); } else { try expectInterruptWakesReader(std.testing.io); }}