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;...@@ -6,10 +6,11 @@ const is_windows = native_os == .windows;
6const windows = std.os.windows;6const windows = std.os.windows;
77
8const std = @import("../std.zig");8const std = @import("../std.zig");
9const Io = std.Io;
10const net = std.Io.net;
9const Allocator = std.mem.Allocator;11const Allocator = std.mem.Allocator;
10const assert = std.debug.assert;12const assert = std.debug.assert;
11const posix = std.posix;13const posix = std.posix;
12const Io = std.Io;
13const ResetEvent = std.Thread.ResetEvent;14const ResetEvent = std.Thread.ResetEvent;
1415
15/// Thread-safe.16/// Thread-safe.
...@@ -1692,9 +1693,9 @@ fn select(userdata: ?*anyopaque, futures: []const *Io.AnyFuture) usize {...@@ -1692,9 +1693,9 @@ fn select(userdata: ?*anyopaque, futures: []const *Io.AnyFuture) usize {
16921693
1693fn netListenIpPosix(1694fn netListenIpPosix(
1694 userdata: ?*anyopaque,1695 userdata: ?*anyopaque,
1695 address: Io.net.IpAddress,1696 address: net.IpAddress,
1696 options: Io.net.IpAddress.ListenOptions,1697 options: net.IpAddress.ListenOptions,
1697) Io.net.IpAddress.ListenError!Io.net.Server {1698) net.IpAddress.ListenError!net.Server {
1698 const pool: *Pool = @ptrCast(@alignCast(userdata));1699 const pool: *Pool = @ptrCast(@alignCast(userdata));
1699 const family = posixAddressFamily(&address);1700 const family = posixAddressFamily(&address);
1700 const socket_fd = try openSocketPosix(pool, family, .{1701 const socket_fd = try openSocketPosix(pool, family, .{
...@@ -1734,10 +1735,10 @@ fn netListenIpPosix(...@@ -1734,10 +1735,10 @@ fn netListenIpPosix(
17341735
1735fn netListenUnix(1736fn netListenUnix(
1736 userdata: ?*anyopaque,1737 userdata: ?*anyopaque,
1737 address: *const Io.net.UnixAddress,1738 address: *const net.UnixAddress,
1738 options: Io.net.UnixAddress.ListenOptions,1739 options: net.UnixAddress.ListenOptions,
1739) Io.net.UnixAddress.ListenError!Io.net.Socket.Handle {1740) net.UnixAddress.ListenError!net.Socket.Handle {
1740 if (!Io.net.has_unix_sockets) return error.AddressFamilyUnsupported;1741 if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
1741 const pool: *Pool = @ptrCast(@alignCast(userdata));1742 const pool: *Pool = @ptrCast(@alignCast(userdata));
1742 const socket_fd = openSocketPosix(pool, posix.AF.UNIX, .{ .mode = .stream }) catch |err| switch (err) {1743 const socket_fd = openSocketPosix(pool, posix.AF.UNIX, .{ .mode = .stream }) catch |err| switch (err) {
1743 error.ProtocolUnsupportedBySystem => return error.AddressFamilyUnsupported,1744 error.ProtocolUnsupportedBySystem => return error.AddressFamilyUnsupported,
...@@ -1903,9 +1904,9 @@ fn setSocketOption(pool: *Pool, fd: posix.fd_t, level: i32, opt_name: u32, optio...@@ -1903,9 +1904,9 @@ fn setSocketOption(pool: *Pool, fd: posix.fd_t, level: i32, opt_name: u32, optio
19031904
1904fn netConnectIpPosix(1905fn netConnectIpPosix(
1905 userdata: ?*anyopaque,1906 userdata: ?*anyopaque,
1906 address: *const Io.net.IpAddress,1907 address: *const net.IpAddress,
1907 options: Io.net.IpAddress.ConnectOptions,1908 options: net.IpAddress.ConnectOptions,
1908) Io.net.IpAddress.ConnectError!Io.net.Stream {1909) net.IpAddress.ConnectError!net.Stream {
1909 if (options.timeout != .none) @panic("TODO");1910 if (options.timeout != .none) @panic("TODO");
1910 const pool: *Pool = @ptrCast(@alignCast(userdata));1911 const pool: *Pool = @ptrCast(@alignCast(userdata));
1911 const family = posixAddressFamily(address);1912 const family = posixAddressFamily(address);
...@@ -1926,9 +1927,9 @@ fn netConnectIpPosix(...@@ -1926,9 +1927,9 @@ fn netConnectIpPosix(
19261927
1927fn netConnectUnix(1928fn netConnectUnix(
1928 userdata: ?*anyopaque,1929 userdata: ?*anyopaque,
1929 address: *const Io.net.UnixAddress,1930 address: *const net.UnixAddress,
1930) Io.net.UnixAddress.ConnectError!Io.net.Socket.Handle {1931) net.UnixAddress.ConnectError!net.Socket.Handle {
1931 if (!Io.net.has_unix_sockets) return error.AddressFamilyUnsupported;1932 if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
1932 const pool: *Pool = @ptrCast(@alignCast(userdata));1933 const pool: *Pool = @ptrCast(@alignCast(userdata));
1933 const socket_fd = try openSocketPosix(pool, posix.AF.UNIX, .{ .mode = .stream });1934 const socket_fd = try openSocketPosix(pool, posix.AF.UNIX, .{ .mode = .stream });
1934 errdefer posix.close(socket_fd);1935 errdefer posix.close(socket_fd);
...@@ -1940,9 +1941,9 @@ fn netConnectUnix(...@@ -1940,9 +1941,9 @@ fn netConnectUnix(
19401941
1941fn netBindIpPosix(1942fn netBindIpPosix(
1942 userdata: ?*anyopaque,1943 userdata: ?*anyopaque,
1943 address: *const Io.net.IpAddress,1944 address: *const net.IpAddress,
1944 options: Io.net.IpAddress.BindOptions,1945 options: net.IpAddress.BindOptions,
1945) Io.net.IpAddress.BindError!Io.net.Socket {1946) net.IpAddress.BindError!net.Socket {
1946 const pool: *Pool = @ptrCast(@alignCast(userdata));1947 const pool: *Pool = @ptrCast(@alignCast(userdata));
1947 const family = posixAddressFamily(address);1948 const family = posixAddressFamily(address);
1948 const socket_fd = try openSocketPosix(pool, family, options);1949 const socket_fd = try openSocketPosix(pool, family, options);
...@@ -1957,7 +1958,7 @@ fn netBindIpPosix(...@@ -1957,7 +1958,7 @@ fn netBindIpPosix(
1957 };1958 };
1958}1959}
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 {
1961 const mode = posixSocketMode(options.mode);1962 const mode = posixSocketMode(options.mode);
1962 const protocol = posixProtocol(options.protocol);1963 const protocol = posixProtocol(options.protocol);
1963 const socket_fd = while (true) {1964 const socket_fd = while (true) {
...@@ -2003,7 +2004,7 @@ fn openSocketPosix(pool: *Pool, family: posix.sa_family_t, options: Io.net.IpAdd...@@ -2003,7 +2004,7 @@ fn openSocketPosix(pool: *Pool, family: posix.sa_family_t, options: Io.net.IpAdd
2003const socket_flags_unsupported = builtin.os.tag.isDarwin() or native_os == .haiku; // 💩💩2004const socket_flags_unsupported = builtin.os.tag.isDarwin() or native_os == .haiku; // 💩💩
2004const have_accept4 = !socket_flags_unsupported;2005const 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 {
2007 const pool: *Pool = @ptrCast(@alignCast(userdata));2008 const pool: *Pool = @ptrCast(@alignCast(userdata));
2008 var storage: PosixAddress = undefined;2009 var storage: PosixAddress = undefined;
2009 var addr_len: posix.socklen_t = @sizeOf(PosixAddress);2010 var addr_len: posix.socklen_t = @sizeOf(PosixAddress);
...@@ -2050,7 +2051,7 @@ fn netAcceptPosix(userdata: ?*anyopaque, listen_fd: Io.net.Socket.Handle) Io.net...@@ -2050,7 +2051,7 @@ fn netAcceptPosix(userdata: ?*anyopaque, listen_fd: Io.net.Socket.Handle) Io.net
2050 } };2051 } };
2051}2052}
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 {
2054 const pool: *Pool = @ptrCast(@alignCast(userdata));2055 const pool: *Pool = @ptrCast(@alignCast(userdata));
20552056
2056 var iovecs_buffer: [max_iovecs_len]posix.iovec = undefined;2057 var iovecs_buffer: [max_iovecs_len]posix.iovec = undefined;
...@@ -2113,10 +2114,10 @@ const have_sendmmsg = builtin.os.tag == .linux;...@@ -2113,10 +2114,10 @@ const have_sendmmsg = builtin.os.tag == .linux;
21132114
2114fn netSend(2115fn netSend(
2115 userdata: ?*anyopaque,2116 userdata: ?*anyopaque,
2116 handle: Io.net.Socket.Handle,2117 handle: net.Socket.Handle,
2117 messages: []Io.net.OutgoingMessage,2118 messages: []net.OutgoingMessage,
2118 flags: Io.net.SendFlags,2119 flags: net.SendFlags,
2119) struct { ?Io.net.Socket.SendError, usize } {2120) struct { ?net.Socket.SendError, usize } {
2120 const pool: *Pool = @ptrCast(@alignCast(userdata));2121 const pool: *Pool = @ptrCast(@alignCast(userdata));
21212122
2122 const posix_flags: u32 =2123 const posix_flags: u32 =
...@@ -2141,10 +2142,10 @@ fn netSend(...@@ -2141,10 +2142,10 @@ fn netSend(
21412142
2142fn netSendOne(2143fn netSendOne(
2143 pool: *Pool,2144 pool: *Pool,
2144 handle: Io.net.Socket.Handle,2145 handle: net.Socket.Handle,
2145 message: *Io.net.OutgoingMessage,2146 message: *net.OutgoingMessage,
2146 flags: u32,2147 flags: u32,
2147) Io.net.Socket.SendError!void {2148) net.Socket.SendError!void {
2148 var addr: PosixAddress = undefined;2149 var addr: PosixAddress = undefined;
2149 var iovec: posix.iovec = .{ .base = @constCast(message.data_ptr), .len = message.data_len };2150 var iovec: posix.iovec = .{ .base = @constCast(message.data_ptr), .len = message.data_len };
2150 const msg: posix.msghdr = .{2151 const msg: posix.msghdr = .{
...@@ -2225,10 +2226,10 @@ fn netSendOne(...@@ -2225,10 +2226,10 @@ fn netSendOne(
22252226
2226fn netSendMany(2227fn netSendMany(
2227 pool: *Pool,2228 pool: *Pool,
2228 handle: Io.net.Socket.Handle,2229 handle: net.Socket.Handle,
2229 messages: []Io.net.OutgoingMessage,2230 messages: []net.OutgoingMessage,
2230 flags: u32,2231 flags: u32,
2231) Io.net.Socket.SendError!usize {2232) net.Socket.SendError!usize {
2232 var msg_buffer: [64]std.os.linux.mmsghdr = undefined;2233 var msg_buffer: [64]std.os.linux.mmsghdr = undefined;
2233 var addr_buffer: [msg_buffer.len]PosixAddress = undefined;2234 var addr_buffer: [msg_buffer.len]PosixAddress = undefined;
2234 var iovecs_buffer: [msg_buffer.len]posix.iovec = undefined;2235 var iovecs_buffer: [msg_buffer.len]posix.iovec = undefined;
...@@ -2292,12 +2293,12 @@ fn netSendMany(...@@ -2292,12 +2293,12 @@ fn netSendMany(
22922293
2293fn netReceive(2294fn netReceive(
2294 userdata: ?*anyopaque,2295 userdata: ?*anyopaque,
2295 handle: Io.net.Socket.Handle,2296 handle: net.Socket.Handle,
2296 message_buffer: []Io.net.IncomingMessage,2297 message_buffer: []net.IncomingMessage,
2297 data_buffer: []u8,2298 data_buffer: []u8,
2298 flags: Io.net.ReceiveFlags,2299 flags: net.ReceiveFlags,
2299 timeout: Io.Timeout,2300 timeout: Io.Timeout,
2300) struct { ?Io.net.Socket.ReceiveTimeoutError, usize } {2301) struct { ?net.Socket.ReceiveTimeoutError, usize } {
2301 const pool: *Pool = @ptrCast(@alignCast(userdata));2302 const pool: *Pool = @ptrCast(@alignCast(userdata));
23022303
2303 // recvmmsg is useless, here's why:2304 // recvmmsg is useless, here's why:
...@@ -2418,11 +2419,11 @@ fn netReceive(...@@ -2418,11 +2419,11 @@ fn netReceive(
24182419
2419fn netWritePosix(2420fn netWritePosix(
2420 userdata: ?*anyopaque,2421 userdata: ?*anyopaque,
2421 fd: Io.net.Socket.Handle,2422 fd: net.Socket.Handle,
2422 header: []const u8,2423 header: []const u8,
2423 data: []const []const u8,2424 data: []const []const u8,
2424 splat: usize,2425 splat: usize,
2425) Io.net.Stream.Writer.Error!usize {2426) net.Stream.Writer.Error!usize {
2426 const pool: *Pool = @ptrCast(@alignCast(userdata));2427 const pool: *Pool = @ptrCast(@alignCast(userdata));
2427 try pool.checkCancel();2428 try pool.checkCancel();
24282429
...@@ -2476,7 +2477,7 @@ fn addBuf(v: []posix.iovec_const, i: *@FieldType(posix.msghdr_const, "iovlen"),...@@ -2476,7 +2477,7 @@ fn addBuf(v: []posix.iovec_const, i: *@FieldType(posix.msghdr_const, "iovlen"),
2476 i.* += 1;2477 i.* += 1;
2477}2478}
24782479
2479fn netClose(userdata: ?*anyopaque, handle: Io.net.Socket.Handle) void {2480fn netClose(userdata: ?*anyopaque, handle: net.Socket.Handle) void {
2480 const pool: *Pool = @ptrCast(@alignCast(userdata));2481 const pool: *Pool = @ptrCast(@alignCast(userdata));
2481 _ = pool;2482 _ = pool;
2482 switch (native_os) {2483 switch (native_os) {
...@@ -2487,8 +2488,8 @@ fn netClose(userdata: ?*anyopaque, handle: Io.net.Socket.Handle) void {...@@ -2487,8 +2488,8 @@ fn netClose(userdata: ?*anyopaque, handle: Io.net.Socket.Handle) void {
24872488
2488fn netInterfaceNameResolve(2489fn netInterfaceNameResolve(
2489 userdata: ?*anyopaque,2490 userdata: ?*anyopaque,
2490 name: *const Io.net.Interface.Name,2491 name: *const net.Interface.Name,
2491) Io.net.Interface.Name.ResolveError!Io.net.Interface {2492) net.Interface.Name.ResolveError!net.Interface {
2492 const pool: *Pool = @ptrCast(@alignCast(userdata));2493 const pool: *Pool = @ptrCast(@alignCast(userdata));
24932494
2494 if (native_os == .linux) {2495 if (native_os == .linux) {
...@@ -2542,7 +2543,7 @@ fn netInterfaceNameResolve(...@@ -2542,7 +2543,7 @@ fn netInterfaceNameResolve(
2542 @panic("unimplemented");2543 @panic("unimplemented");
2543}2544}
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 {
2546 const pool: *Pool = @ptrCast(@alignCast(userdata));2547 const pool: *Pool = @ptrCast(@alignCast(userdata));
2547 try pool.checkCancel();2548 try pool.checkCancel();
25482549
...@@ -2573,14 +2574,14 @@ const UnixAddress = extern union {...@@ -2573,14 +2574,14 @@ const UnixAddress = extern union {
2573 un: posix.sockaddr.un,2574 un: posix.sockaddr.un,
2574};2575};
25752576
2576fn posixAddressFamily(a: *const Io.net.IpAddress) posix.sa_family_t {2577fn posixAddressFamily(a: *const net.IpAddress) posix.sa_family_t {
2577 return switch (a.*) {2578 return switch (a.*) {
2578 .ip4 => posix.AF.INET,2579 .ip4 => posix.AF.INET,
2579 .ip6 => posix.AF.INET6,2580 .ip6 => posix.AF.INET6,
2580 };2581 };
2581}2582}
25822583
2583fn addressFromPosix(posix_address: *PosixAddress) Io.net.IpAddress {2584fn addressFromPosix(posix_address: *PosixAddress) net.IpAddress {
2584 return switch (posix_address.any.family) {2585 return switch (posix_address.any.family) {
2585 posix.AF.INET => .{ .ip4 = address4FromPosix(&posix_address.in) },2586 posix.AF.INET => .{ .ip4 = address4FromPosix(&posix_address.in) },
2586 posix.AF.INET6 => .{ .ip6 = address6FromPosix(&posix_address.in6) },2587 posix.AF.INET6 => .{ .ip6 = address6FromPosix(&posix_address.in6) },
...@@ -2588,7 +2589,7 @@ fn addressFromPosix(posix_address: *PosixAddress) Io.net.IpAddress {...@@ -2588,7 +2589,7 @@ fn addressFromPosix(posix_address: *PosixAddress) Io.net.IpAddress {
2588 };2589 };
2589}2590}
25902591
2591fn addressToPosix(a: *const Io.net.IpAddress, storage: *PosixAddress) posix.socklen_t {2592fn addressToPosix(a: *const net.IpAddress, storage: *PosixAddress) posix.socklen_t {
2592 return switch (a.*) {2593 return switch (a.*) {
2593 .ip4 => |ip4| {2594 .ip4 => |ip4| {
2594 storage.in = address4ToPosix(ip4);2595 storage.in = address4ToPosix(ip4);
...@@ -2601,21 +2602,21 @@ fn addressToPosix(a: *const Io.net.IpAddress, storage: *PosixAddress) posix.sock...@@ -2601,21 +2602,21 @@ fn addressToPosix(a: *const Io.net.IpAddress, storage: *PosixAddress) posix.sock
2601 };2602 };
2602}2603}
26032604
2604fn addressUnixToPosix(a: *const Io.net.UnixAddress, storage: *UnixAddress) posix.socklen_t {2605fn addressUnixToPosix(a: *const net.UnixAddress, storage: *UnixAddress) posix.socklen_t {
2605 @memcpy(storage.un.path[0..a.path.len], a.path);2606 @memcpy(storage.un.path[0..a.path.len], a.path);
2606 storage.un.family = posix.AF.UNIX;2607 storage.un.family = posix.AF.UNIX;
2607 storage.un.path[a.path.len] = 0;2608 storage.un.path[a.path.len] = 0;
2608 return @sizeOf(posix.sockaddr.un);2609 return @sizeOf(posix.sockaddr.un);
2609}2610}
26102611
2611fn address4FromPosix(in: *posix.sockaddr.in) Io.net.Ip4Address {2612fn address4FromPosix(in: *posix.sockaddr.in) net.Ip4Address {
2612 return .{2613 return .{
2613 .port = std.mem.bigToNative(u16, in.port),2614 .port = std.mem.bigToNative(u16, in.port),
2614 .bytes = @bitCast(in.addr),2615 .bytes = @bitCast(in.addr),
2615 };2616 };
2616}2617}
26172618
2618fn address6FromPosix(in6: *posix.sockaddr.in6) Io.net.Ip6Address {2619fn address6FromPosix(in6: *posix.sockaddr.in6) net.Ip6Address {
2619 return .{2620 return .{
2620 .port = std.mem.bigToNative(u16, in6.port),2621 .port = std.mem.bigToNative(u16, in6.port),
2621 .bytes = in6.addr,2622 .bytes = in6.addr,
...@@ -2624,14 +2625,14 @@ fn address6FromPosix(in6: *posix.sockaddr.in6) Io.net.Ip6Address {...@@ -2624,14 +2625,14 @@ fn address6FromPosix(in6: *posix.sockaddr.in6) Io.net.Ip6Address {
2624 };2625 };
2625}2626}
26262627
2627fn address4ToPosix(a: Io.net.Ip4Address) posix.sockaddr.in {2628fn address4ToPosix(a: net.Ip4Address) posix.sockaddr.in {
2628 return .{2629 return .{
2629 .port = std.mem.nativeToBig(u16, a.port),2630 .port = std.mem.nativeToBig(u16, a.port),
2630 .addr = @bitCast(a.bytes),2631 .addr = @bitCast(a.bytes),
2631 };2632 };
2632}2633}
26332634
2634fn address6ToPosix(a: *const Io.net.Ip6Address) posix.sockaddr.in6 {2635fn address6ToPosix(a: *const net.Ip6Address) posix.sockaddr.in6 {
2635 return .{2636 return .{
2636 .port = std.mem.nativeToBig(u16, a.port),2637 .port = std.mem.nativeToBig(u16, a.port),
2637 .flowinfo = a.flow,2638 .flowinfo = a.flow,
...@@ -2647,7 +2648,7 @@ fn errnoBug(err: posix.E) Io.UnexpectedError {...@@ -2647,7 +2648,7 @@ fn errnoBug(err: posix.E) Io.UnexpectedError {
2647 }2648 }
2648}2649}
26492650
2650fn posixSocketMode(mode: Io.net.Socket.Mode) u32 {2651fn posixSocketMode(mode: net.Socket.Mode) u32 {
2651 return switch (mode) {2652 return switch (mode) {
2652 .stream => posix.SOCK.STREAM,2653 .stream => posix.SOCK.STREAM,
2653 .dgram => posix.SOCK.DGRAM,2654 .dgram => posix.SOCK.DGRAM,
...@@ -2657,7 +2658,7 @@ fn posixSocketMode(mode: Io.net.Socket.Mode) u32 {...@@ -2657,7 +2658,7 @@ fn posixSocketMode(mode: Io.net.Socket.Mode) u32 {
2657 };2658 };
2658}2659}
26592660
2660fn posixProtocol(protocol: ?Io.net.Protocol) u32 {2661fn posixProtocol(protocol: ?net.Protocol) u32 {
2661 return @intFromEnum(protocol orelse return 0);2662 return @intFromEnum(protocol orelse return 0);
2662}2663}
26632664