authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-14 10:50:00-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-29 06:20:49-07:00
log1382e4122603fd2b57e4feb0eff76ba2d73a913a
tree8c7a60ae9264d5d70b8e5d8d22bed7f9fcd78a01
parent2bcdde29850c4b7b769ac3e0ffc636825fd7b5e5

std.Io.Threaded: import std.Io.net


1 files changed, 51 insertions(+), 50 deletions(-)

lib/std/Io/Threaded.zig+51-50
......@@ -6,10 +6,11 @@ const is_windows = native_os == .windows;
66const windows = std.os.windows;
77
88const std = @import("../std.zig");
9const Io = std.Io;
10const net = std.Io.net;
911const Allocator = std.mem.Allocator;
1012const assert = std.debug.assert;
1113const posix = std.posix;
12const Io = std.Io;
1314const ResetEvent = std.Thread.ResetEvent;
1415
1516/// Thread-safe.
......@@ -1692,9 +1693,9 @@ fn select(userdata: ?*anyopaque, futures: []const *Io.AnyFuture) usize {
16921693
16931694fn netListenIpPosix(
16941695 userdata: ?*anyopaque,
1695 address: Io.net.IpAddress,
1696 options: Io.net.IpAddress.ListenOptions,
1697) Io.net.IpAddress.ListenError!Io.net.Server {
1696 address: net.IpAddress,
1697 options: net.IpAddress.ListenOptions,
1698) net.IpAddress.ListenError!net.Server {
16981699 const pool: *Pool = @ptrCast(@alignCast(userdata));
16991700 const family = posixAddressFamily(&address);
17001701 const socket_fd = try openSocketPosix(pool, family, .{
......@@ -1734,10 +1735,10 @@ fn netListenIpPosix(
17341735
17351736fn netListenUnix(
17361737 userdata: ?*anyopaque,
1737 address: *const Io.net.UnixAddress,
1738 options: Io.net.UnixAddress.ListenOptions,
1739) Io.net.UnixAddress.ListenError!Io.net.Socket.Handle {
1740 if (!Io.net.has_unix_sockets) return error.AddressFamilyUnsupported;
1738 address: *const net.UnixAddress,
1739 options: net.UnixAddress.ListenOptions,
1740) net.UnixAddress.ListenError!net.Socket.Handle {
1741 if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
17411742 const pool: *Pool = @ptrCast(@alignCast(userdata));
17421743 const socket_fd = openSocketPosix(pool, posix.AF.UNIX, .{ .mode = .stream }) catch |err| switch (err) {
17431744 error.ProtocolUnsupportedBySystem => return error.AddressFamilyUnsupported,
......@@ -1903,9 +1904,9 @@ fn setSocketOption(pool: *Pool, fd: posix.fd_t, level: i32, opt_name: u32, optio
19031904
19041905fn netConnectIpPosix(
19051906 userdata: ?*anyopaque,
1906 address: *const Io.net.IpAddress,
1907 options: Io.net.IpAddress.ConnectOptions,
1908) Io.net.IpAddress.ConnectError!Io.net.Stream {
1907 address: *const net.IpAddress,
1908 options: net.IpAddress.ConnectOptions,
1909) net.IpAddress.ConnectError!net.Stream {
19091910 if (options.timeout != .none) @panic("TODO");
19101911 const pool: *Pool = @ptrCast(@alignCast(userdata));
19111912 const family = posixAddressFamily(address);
......@@ -1926,9 +1927,9 @@ fn netConnectIpPosix(
19261927
19271928fn netConnectUnix(
19281929 userdata: ?*anyopaque,
1929 address: *const Io.net.UnixAddress,
1930) Io.net.UnixAddress.ConnectError!Io.net.Socket.Handle {
1931 if (!Io.net.has_unix_sockets) return error.AddressFamilyUnsupported;
1930 address: *const net.UnixAddress,
1931) net.UnixAddress.ConnectError!net.Socket.Handle {
1932 if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
19321933 const pool: *Pool = @ptrCast(@alignCast(userdata));
19331934 const socket_fd = try openSocketPosix(pool, posix.AF.UNIX, .{ .mode = .stream });
19341935 errdefer posix.close(socket_fd);
......@@ -1940,9 +1941,9 @@ fn netConnectUnix(
19401941
19411942fn netBindIpPosix(
19421943 userdata: ?*anyopaque,
1943 address: *const Io.net.IpAddress,
1944 options: Io.net.IpAddress.BindOptions,
1945) Io.net.IpAddress.BindError!Io.net.Socket {
1944 address: *const net.IpAddress,
1945 options: net.IpAddress.BindOptions,
1946) net.IpAddress.BindError!net.Socket {
19461947 const pool: *Pool = @ptrCast(@alignCast(userdata));
19471948 const family = posixAddressFamily(address);
19481949 const socket_fd = try openSocketPosix(pool, family, options);
......@@ -1957,7 +1958,7 @@ fn netBindIpPosix(
19571958 };
19581959}
19591960
1960fn openSocketPosix(pool: *Pool, family: posix.sa_family_t, options: Io.net.IpAddress.BindOptions) !posix.socket_t {
1961fn openSocketPosix(pool: *Pool, family: posix.sa_family_t, options: net.IpAddress.BindOptions) !posix.socket_t {
19611962 const mode = posixSocketMode(options.mode);
19621963 const protocol = posixProtocol(options.protocol);
19631964 const socket_fd = while (true) {
......@@ -2003,7 +2004,7 @@ fn openSocketPosix(pool: *Pool, family: posix.sa_family_t, options: Io.net.IpAdd
20032004const socket_flags_unsupported = builtin.os.tag.isDarwin() or native_os == .haiku; // 💩💩
20042005const have_accept4 = !socket_flags_unsupported;
20052006
2006fn netAcceptPosix(userdata: ?*anyopaque, listen_fd: Io.net.Socket.Handle) Io.net.Server.AcceptError!Io.net.Stream {
2007fn netAcceptPosix(userdata: ?*anyopaque, listen_fd: net.Socket.Handle) net.Server.AcceptError!net.Stream {
20072008 const pool: *Pool = @ptrCast(@alignCast(userdata));
20082009 var storage: PosixAddress = undefined;
20092010 var addr_len: posix.socklen_t = @sizeOf(PosixAddress);
......@@ -2050,7 +2051,7 @@ fn netAcceptPosix(userdata: ?*anyopaque, listen_fd: Io.net.Socket.Handle) Io.net
20502051 } };
20512052}
20522053
2053fn netReadPosix(userdata: ?*anyopaque, fd: Io.net.Socket.Handle, data: [][]u8) Io.net.Stream.Reader.Error!usize {
2054fn netReadPosix(userdata: ?*anyopaque, fd: net.Socket.Handle, data: [][]u8) net.Stream.Reader.Error!usize {
20542055 const pool: *Pool = @ptrCast(@alignCast(userdata));
20552056
20562057 var iovecs_buffer: [max_iovecs_len]posix.iovec = undefined;
......@@ -2113,10 +2114,10 @@ const have_sendmmsg = builtin.os.tag == .linux;
21132114
21142115fn netSend(
21152116 userdata: ?*anyopaque,
2116 handle: Io.net.Socket.Handle,
2117 messages: []Io.net.OutgoingMessage,
2118 flags: Io.net.SendFlags,
2119) struct { ?Io.net.Socket.SendError, usize } {
2117 handle: net.Socket.Handle,
2118 messages: []net.OutgoingMessage,
2119 flags: net.SendFlags,
2120) struct { ?net.Socket.SendError, usize } {
21202121 const pool: *Pool = @ptrCast(@alignCast(userdata));
21212122
21222123 const posix_flags: u32 =
......@@ -2141,10 +2142,10 @@ fn netSend(
21412142
21422143fn netSendOne(
21432144 pool: *Pool,
2144 handle: Io.net.Socket.Handle,
2145 message: *Io.net.OutgoingMessage,
2145 handle: net.Socket.Handle,
2146 message: *net.OutgoingMessage,
21462147 flags: u32,
2147) Io.net.Socket.SendError!void {
2148) net.Socket.SendError!void {
21482149 var addr: PosixAddress = undefined;
21492150 var iovec: posix.iovec = .{ .base = @constCast(message.data_ptr), .len = message.data_len };
21502151 const msg: posix.msghdr = .{
......@@ -2225,10 +2226,10 @@ fn netSendOne(
22252226
22262227fn netSendMany(
22272228 pool: *Pool,
2228 handle: Io.net.Socket.Handle,
2229 messages: []Io.net.OutgoingMessage,
2229 handle: net.Socket.Handle,
2230 messages: []net.OutgoingMessage,
22302231 flags: u32,
2231) Io.net.Socket.SendError!usize {
2232) net.Socket.SendError!usize {
22322233 var msg_buffer: [64]std.os.linux.mmsghdr = undefined;
22332234 var addr_buffer: [msg_buffer.len]PosixAddress = undefined;
22342235 var iovecs_buffer: [msg_buffer.len]posix.iovec = undefined;
......@@ -2292,12 +2293,12 @@ fn netSendMany(
22922293
22932294fn netReceive(
22942295 userdata: ?*anyopaque,
2295 handle: Io.net.Socket.Handle,
2296 message_buffer: []Io.net.IncomingMessage,
2296 handle: net.Socket.Handle,
2297 message_buffer: []net.IncomingMessage,
22972298 data_buffer: []u8,
2298 flags: Io.net.ReceiveFlags,
2299 flags: net.ReceiveFlags,
22992300 timeout: Io.Timeout,
2300) struct { ?Io.net.Socket.ReceiveTimeoutError, usize } {
2301) struct { ?net.Socket.ReceiveTimeoutError, usize } {
23012302 const pool: *Pool = @ptrCast(@alignCast(userdata));
23022303
23032304 // recvmmsg is useless, here's why:
......@@ -2418,11 +2419,11 @@ fn netReceive(
24182419
24192420fn netWritePosix(
24202421 userdata: ?*anyopaque,
2421 fd: Io.net.Socket.Handle,
2422 fd: net.Socket.Handle,
24222423 header: []const u8,
24232424 data: []const []const u8,
24242425 splat: usize,
2425) Io.net.Stream.Writer.Error!usize {
2426) net.Stream.Writer.Error!usize {
24262427 const pool: *Pool = @ptrCast(@alignCast(userdata));
24272428 try pool.checkCancel();
24282429
......@@ -2476,7 +2477,7 @@ fn addBuf(v: []posix.iovec_const, i: *@FieldType(posix.msghdr_const, "iovlen"),
24762477 i.* += 1;
24772478}
24782479
2479fn netClose(userdata: ?*anyopaque, handle: Io.net.Socket.Handle) void {
2480fn netClose(userdata: ?*anyopaque, handle: net.Socket.Handle) void {
24802481 const pool: *Pool = @ptrCast(@alignCast(userdata));
24812482 _ = pool;
24822483 switch (native_os) {
......@@ -2487,8 +2488,8 @@ fn netClose(userdata: ?*anyopaque, handle: Io.net.Socket.Handle) void {
24872488
24882489fn netInterfaceNameResolve(
24892490 userdata: ?*anyopaque,
2490 name: *const Io.net.Interface.Name,
2491) Io.net.Interface.Name.ResolveError!Io.net.Interface {
2491 name: *const net.Interface.Name,
2492) net.Interface.Name.ResolveError!net.Interface {
24922493 const pool: *Pool = @ptrCast(@alignCast(userdata));
24932494
24942495 if (native_os == .linux) {
......@@ -2542,7 +2543,7 @@ fn netInterfaceNameResolve(
25422543 @panic("unimplemented");
25432544}
25442545
2545fn netInterfaceName(userdata: ?*anyopaque, interface: Io.net.Interface) Io.net.Interface.NameError!Io.net.Interface.Name {
2546fn netInterfaceName(userdata: ?*anyopaque, interface: net.Interface) net.Interface.NameError!net.Interface.Name {
25462547 const pool: *Pool = @ptrCast(@alignCast(userdata));
25472548 try pool.checkCancel();
25482549
......@@ -2573,14 +2574,14 @@ const UnixAddress = extern union {
25732574 un: posix.sockaddr.un,
25742575};
25752576
2576fn posixAddressFamily(a: *const Io.net.IpAddress) posix.sa_family_t {
2577fn posixAddressFamily(a: *const net.IpAddress) posix.sa_family_t {
25772578 return switch (a.*) {
25782579 .ip4 => posix.AF.INET,
25792580 .ip6 => posix.AF.INET6,
25802581 };
25812582}
25822583
2583fn addressFromPosix(posix_address: *PosixAddress) Io.net.IpAddress {
2584fn addressFromPosix(posix_address: *PosixAddress) net.IpAddress {
25842585 return switch (posix_address.any.family) {
25852586 posix.AF.INET => .{ .ip4 = address4FromPosix(&posix_address.in) },
25862587 posix.AF.INET6 => .{ .ip6 = address6FromPosix(&posix_address.in6) },
......@@ -2588,7 +2589,7 @@ fn addressFromPosix(posix_address: *PosixAddress) Io.net.IpAddress {
25882589 };
25892590}
25902591
2591fn addressToPosix(a: *const Io.net.IpAddress, storage: *PosixAddress) posix.socklen_t {
2592fn addressToPosix(a: *const net.IpAddress, storage: *PosixAddress) posix.socklen_t {
25922593 return switch (a.*) {
25932594 .ip4 => |ip4| {
25942595 storage.in = address4ToPosix(ip4);
......@@ -2601,21 +2602,21 @@ fn addressToPosix(a: *const Io.net.IpAddress, storage: *PosixAddress) posix.sock
26012602 };
26022603}
26032604
2604fn addressUnixToPosix(a: *const Io.net.UnixAddress, storage: *UnixAddress) posix.socklen_t {
2605fn addressUnixToPosix(a: *const net.UnixAddress, storage: *UnixAddress) posix.socklen_t {
26052606 @memcpy(storage.un.path[0..a.path.len], a.path);
26062607 storage.un.family = posix.AF.UNIX;
26072608 storage.un.path[a.path.len] = 0;
26082609 return @sizeOf(posix.sockaddr.un);
26092610}
26102611
2611fn address4FromPosix(in: *posix.sockaddr.in) Io.net.Ip4Address {
2612fn address4FromPosix(in: *posix.sockaddr.in) net.Ip4Address {
26122613 return .{
26132614 .port = std.mem.bigToNative(u16, in.port),
26142615 .bytes = @bitCast(in.addr),
26152616 };
26162617}
26172618
2618fn address6FromPosix(in6: *posix.sockaddr.in6) Io.net.Ip6Address {
2619fn address6FromPosix(in6: *posix.sockaddr.in6) net.Ip6Address {
26192620 return .{
26202621 .port = std.mem.bigToNative(u16, in6.port),
26212622 .bytes = in6.addr,
......@@ -2624,14 +2625,14 @@ fn address6FromPosix(in6: *posix.sockaddr.in6) Io.net.Ip6Address {
26242625 };
26252626}
26262627
2627fn address4ToPosix(a: Io.net.Ip4Address) posix.sockaddr.in {
2628fn address4ToPosix(a: net.Ip4Address) posix.sockaddr.in {
26282629 return .{
26292630 .port = std.mem.nativeToBig(u16, a.port),
26302631 .addr = @bitCast(a.bytes),
26312632 };
26322633}
26332634
2634fn address6ToPosix(a: *const Io.net.Ip6Address) posix.sockaddr.in6 {
2635fn address6ToPosix(a: *const net.Ip6Address) posix.sockaddr.in6 {
26352636 return .{
26362637 .port = std.mem.nativeToBig(u16, a.port),
26372638 .flowinfo = a.flow,
......@@ -2647,7 +2648,7 @@ fn errnoBug(err: posix.E) Io.UnexpectedError {
26472648 }
26482649}
26492650
2650fn posixSocketMode(mode: Io.net.Socket.Mode) u32 {
2651fn posixSocketMode(mode: net.Socket.Mode) u32 {
26512652 return switch (mode) {
26522653 .stream => posix.SOCK.STREAM,
26532654 .dgram => posix.SOCK.DGRAM,
......@@ -2657,7 +2658,7 @@ fn posixSocketMode(mode: Io.net.Socket.Mode) u32 {
26572658 };
26582659}
26592660
2660fn posixProtocol(protocol: ?Io.net.Protocol) u32 {
2661fn posixProtocol(protocol: ?net.Protocol) u32 {
26612662 return @intFromEnum(protocol orelse return 0);
26622663}
26632664