authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-03-10 20:08:48-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-03-11 22:46:13+01:00
log3069917384bd31dfb8e6c32e932222ab19609df1
tree6ac73066489b4349a28bf8f41ce3f791ff8d7741
parentb4ffb402c082605c4b324e88120306fc8fb3cf32

std.Io.Threaded: use AlertableSyscall for ws2_32 operations

closes #30865

2 files changed, 180 insertions(+), 266 deletions(-)

lib/std/Io/Threaded.zig+174-265
...@@ -1496,6 +1496,18 @@ const AlertableSyscall = struct {...@@ -1496,6 +1496,18 @@ const AlertableSyscall = struct {
1496 s.finish();1496 s.finish();
1497 return windows.unexpectedStatus(status);1497 return windows.unexpectedStatus(status);
1498 }1498 }
1499
1500 fn unexpectedWsaError(s: AlertableSyscall, err: ws2_32.WinsockError) Io.UnexpectedError {
1501 @branchHint(.cold);
1502 s.finish();
1503 return windows.unexpectedWsaError(err);
1504 }
1505
1506 fn wsaErrorBug(s: AlertableSyscall, err: ws2_32.WinsockError) Io.UnexpectedError {
1507 @branchHint(.cold);
1508 s.finish();
1509 return windows.wsaErrorBug(err);
1510 }
1499};1511};
15001512
1501pub fn waitForApcOrAlert() void {1513pub fn waitForApcOrAlert() void {
...@@ -11692,7 +11704,7 @@ fn netListenIpWindows(...@@ -11692,7 +11704,7 @@ fn netListenIpWindows(
11692 var storage: WsaAddress = undefined;11704 var storage: WsaAddress = undefined;
11693 var addr_len = addressToWsa(&address, &storage);11705 var addr_len = addressToWsa(&address, &storage);
1169411706
11695 var syscall: Syscall = try .start();11707 var syscall: AlertableSyscall = try .start();
11696 while (true) {11708 while (true) {
11697 const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);11709 const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);
11698 if (rc != ws2_32.SOCKET_ERROR) {11710 if (rc != ws2_32.SOCKET_ERROR) {
...@@ -11710,19 +11722,14 @@ fn netListenIpWindows(...@@ -11710,19 +11722,14 @@ fn netListenIpWindows(
11710 try syscall.checkCancel();11722 try syscall.checkCancel();
11711 continue;11723 continue;
11712 },11724 },
11713 else => |e| {11725 .EADDRINUSE => return syscall.fail(error.AddressInUse),
11714 syscall.finish();11726 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
11715 switch (e) {11727 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
11716 .EADDRINUSE => return error.AddressInUse,11728 .EFAULT => |err| return syscall.wsaErrorBug(err),
11717 .EADDRNOTAVAIL => return error.AddressUnavailable,11729 .EINVAL => |err| return syscall.wsaErrorBug(err),
11718 .ENOTSOCK => |err| return wsaErrorBug(err),11730 .ENOBUFS => return syscall.fail(error.SystemResources),
11719 .EFAULT => |err| return wsaErrorBug(err),11731 .ENETDOWN => return syscall.fail(error.NetworkDown),
11720 .EINVAL => |err| return wsaErrorBug(err),11732 else => |err| return syscall.unexpectedWsaError(err),
11721 .ENOBUFS => return error.SystemResources,
11722 .ENETDOWN => return error.NetworkDown,
11723 else => |err| return windows.unexpectedWSAError(err),
11724 }
11725 },
11726 }11733 }
11727 }11734 }
1172811735
...@@ -11744,20 +11751,15 @@ fn netListenIpWindows(...@@ -11744,20 +11751,15 @@ fn netListenIpWindows(
11744 try syscall.checkCancel();11751 try syscall.checkCancel();
11745 continue;11752 continue;
11746 },11753 },
11747 else => |e| {11754 .ENETDOWN => return syscall.fail(error.NetworkDown),
11748 syscall.finish();11755 .EADDRINUSE => return syscall.fail(error.AddressInUse),
11749 switch (e) {11756 .EMFILE, .ENOBUFS => return syscall.fail(error.SystemResources),
11750 .ENETDOWN => return error.NetworkDown,11757 .EISCONN => |err| return syscall.wsaErrorBug(err),
11751 .EADDRINUSE => return error.AddressInUse,11758 .EINVAL => |err| return syscall.wsaErrorBug(err),
11752 .EISCONN => |err| return wsaErrorBug(err),11759 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
11753 .EINVAL => |err| return wsaErrorBug(err),11760 .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err),
11754 .EMFILE, .ENOBUFS => return error.SystemResources,11761 .EINPROGRESS => |err| return syscall.wsaErrorBug(err),
11755 .ENOTSOCK => |err| return wsaErrorBug(err),11762 else => |err| return syscall.unexpectedWsaError(err),
11756 .EOPNOTSUPP => |err| return wsaErrorBug(err),
11757 .EINPROGRESS => |err| return wsaErrorBug(err),
11758 else => |err| return windows.unexpectedWSAError(err),
11759 }
11760 },
11761 }11763 }
11762 }11764 }
1176311765
...@@ -11841,7 +11843,7 @@ fn netListenUnixWindows(...@@ -11841,7 +11843,7 @@ fn netListenUnixWindows(
11841 var storage: WsaAddress = undefined;11843 var storage: WsaAddress = undefined;
11842 const addr_len = addressUnixToWsa(address, &storage);11844 const addr_len = addressUnixToWsa(address, &storage);
1184311845
11844 var syscall: Syscall = try .start();11846 var syscall: AlertableSyscall = try .start();
11845 while (true) {11847 while (true) {
11846 const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);11848 const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);
11847 if (rc != ws2_32.SOCKET_ERROR) break;11849 if (rc != ws2_32.SOCKET_ERROR) break;
...@@ -11856,19 +11858,14 @@ fn netListenUnixWindows(...@@ -11856,19 +11858,14 @@ fn netListenUnixWindows(
11856 try syscall.checkCancel();11858 try syscall.checkCancel();
11857 continue;11859 continue;
11858 },11860 },
11859 else => |e| {11861 .EADDRINUSE => return syscall.fail(error.AddressInUse),
11860 syscall.finish();11862 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
11861 switch (e) {11863 .ENOBUFS => return syscall.fail(error.SystemResources),
11862 .EADDRINUSE => return error.AddressInUse,11864 .ENETDOWN => return syscall.fail(error.NetworkDown),
11863 .EADDRNOTAVAIL => return error.AddressUnavailable,11865 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
11864 .ENOTSOCK => |err| return wsaErrorBug(err),11866 .EFAULT => |err| return syscall.wsaErrorBug(err),
11865 .EFAULT => |err| return wsaErrorBug(err),11867 .EINVAL => |err| return syscall.wsaErrorBug(err),
11866 .EINVAL => |err| return wsaErrorBug(err),11868 else => |err| return syscall.unexpectedWsaError(err),
11867 .ENOBUFS => return error.SystemResources,
11868 .ENETDOWN => return error.NetworkDown,
11869 else => |err| return windows.unexpectedWSAError(err),
11870 }
11871 },
11872 }11869 }
11873 }11870 }
1187411871
...@@ -11887,20 +11884,15 @@ fn netListenUnixWindows(...@@ -11887,20 +11884,15 @@ fn netListenUnixWindows(
11887 syscall = try .start();11884 syscall = try .start();
11888 continue;11885 continue;
11889 },11886 },
11890 else => |e| {11887 .ENETDOWN => return syscall.fail(error.NetworkDown),
11891 syscall.finish();11888 .EADDRINUSE => return syscall.fail(error.AddressInUse),
11892 switch (e) {11889 .EMFILE, .ENOBUFS => return syscall.fail(error.SystemResources),
11893 .ENETDOWN => return error.NetworkDown,11890 .EISCONN => |err| return syscall.wsaErrorBug(err),
11894 .EADDRINUSE => return error.AddressInUse,11891 .EINVAL => |err| return syscall.wsaErrorBug(err),
11895 .EISCONN => |err| return wsaErrorBug(err),11892 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
11896 .EINVAL => |err| return wsaErrorBug(err),11893 .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err),
11897 .EMFILE, .ENOBUFS => return error.SystemResources,11894 .EINPROGRESS => |err| return syscall.wsaErrorBug(err),
11898 .ENOTSOCK => |err| return wsaErrorBug(err),11895 else => |err| return syscall.unexpectedWsaError(err),
11899 .EOPNOTSUPP => |err| return wsaErrorBug(err),
11900 .EINPROGRESS => |err| return wsaErrorBug(err),
11901 else => |err| return windows.unexpectedWSAError(err),
11902 }
11903 },
11904 }11896 }
11905 }11897 }
11906}11898}
...@@ -12111,7 +12103,7 @@ fn wsaGetSockName(...@@ -12111,7 +12103,7 @@ fn wsaGetSockName(
12111 addr: *ws2_32.sockaddr,12103 addr: *ws2_32.sockaddr,
12112 addr_len: *i32,12104 addr_len: *i32,
12113) !void {12105) !void {
12114 var syscall: Syscall = try .start();12106 var syscall: AlertableSyscall = try .start();
12115 while (true) {12107 while (true) {
12116 const rc = ws2_32.getsockname(handle, addr, addr_len);12108 const rc = ws2_32.getsockname(handle, addr, addr_len);
12117 if (rc != ws2_32.SOCKET_ERROR) {12109 if (rc != ws2_32.SOCKET_ERROR) {
...@@ -12129,16 +12121,11 @@ fn wsaGetSockName(...@@ -12129,16 +12121,11 @@ fn wsaGetSockName(
12129 syscall = try .start();12121 syscall = try .start();
12130 continue;12122 continue;
12131 },12123 },
12132 else => |e| {12124 .ENETDOWN => return syscall.fail(error.NetworkDown),
12133 syscall.finish();12125 .EFAULT => |err| return syscall.wsaErrorBug(err),
12134 switch (e) {12126 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12135 .ENETDOWN => return error.NetworkDown,12127 .EINVAL => |err| return syscall.wsaErrorBug(err),
12136 .EFAULT => |err| return wsaErrorBug(err),12128 else => |err| return syscall.unexpectedWsaError(err),
12137 .ENOTSOCK => |err| return wsaErrorBug(err),
12138 .EINVAL => |err| return wsaErrorBug(err),
12139 else => |err| return windows.unexpectedWSAError(err),
12140 }
12141 },
12142 }12129 }
12143 }12130 }
12144}12131}
...@@ -12172,7 +12159,7 @@ fn setSocketOption(fd: posix.fd_t, level: i32, opt_name: u32, option: u32) !void...@@ -12172,7 +12159,7 @@ fn setSocketOption(fd: posix.fd_t, level: i32, opt_name: u32, option: u32) !void
1217212159
12173fn setSocketOptionWsa(t: *Threaded, socket: Io.net.Socket.Handle, level: i32, opt_name: u32, option: u32) !void {12160fn setSocketOptionWsa(t: *Threaded, socket: Io.net.Socket.Handle, level: i32, opt_name: u32, option: u32) !void {
12174 const o: []const u8 = @ptrCast(&option);12161 const o: []const u8 = @ptrCast(&option);
12175 var syscall: Syscall = try .start();12162 var syscall: AlertableSyscall = try .start();
12176 const rc = ws2_32.setsockopt(socket, level, @bitCast(opt_name), o.ptr, @intCast(o.len));12163 const rc = ws2_32.setsockopt(socket, level, @bitCast(opt_name), o.ptr, @intCast(o.len));
12177 while (true) {12164 while (true) {
12178 if (rc != ws2_32.SOCKET_ERROR) return syscall.finish();12165 if (rc != ws2_32.SOCKET_ERROR) return syscall.finish();
...@@ -12188,14 +12175,8 @@ fn setSocketOptionWsa(t: *Threaded, socket: Io.net.Socket.Handle, level: i32, op...@@ -12188,14 +12175,8 @@ fn setSocketOptionWsa(t: *Threaded, socket: Io.net.Socket.Handle, level: i32, op
12188 continue;12175 continue;
12189 },12176 },
12190 .ENETDOWN => return syscall.fail(error.NetworkDown),12177 .ENETDOWN => return syscall.fail(error.NetworkDown),
12191 .EFAULT, .ENOTSOCK, .EINVAL => |err| {12178 .EFAULT, .ENOTSOCK, .EINVAL => |err| return syscall.wsaErrorBug(err),
12192 syscall.finish();12179 else => |err| return syscall.unexpectedWsaError(err),
12193 return wsaErrorBug(err);
12194 },
12195 else => |err| {
12196 syscall.finish();
12197 return windows.unexpectedWSAError(err);
12198 },
12199 }12180 }
12200 }12181 }
12201}12182}
...@@ -12243,7 +12224,7 @@ fn netConnectIpWindows(...@@ -12243,7 +12224,7 @@ fn netConnectIpWindows(
12243 var storage: WsaAddress = undefined;12224 var storage: WsaAddress = undefined;
12244 var addr_len = addressToWsa(address, &storage);12225 var addr_len = addressToWsa(address, &storage);
1224512226
12246 var syscall: Syscall = try .start();12227 var syscall: AlertableSyscall = try .start();
12247 while (true) {12228 while (true) {
12248 const rc = ws2_32.connect(socket_handle, &storage.any, addr_len);12229 const rc = ws2_32.connect(socket_handle, &storage.any, addr_len);
12249 if (rc != ws2_32.SOCKET_ERROR) {12230 if (rc != ws2_32.SOCKET_ERROR) {
...@@ -12261,26 +12242,21 @@ fn netConnectIpWindows(...@@ -12261,26 +12242,21 @@ fn netConnectIpWindows(
12261 syscall = try .start();12242 syscall = try .start();
12262 continue;12243 continue;
12263 },12244 },
12264 else => |e| {12245 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
12265 syscall.finish();12246 .ECONNREFUSED => return syscall.fail(error.ConnectionRefused),
12266 switch (e) {12247 .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
12267 .EADDRNOTAVAIL => return error.AddressUnavailable,12248 .ETIMEDOUT => return syscall.fail(error.Timeout),
12268 .ECONNREFUSED => return error.ConnectionRefused,12249 .EHOSTUNREACH => return syscall.fail(error.HostUnreachable),
12269 .ECONNRESET => return error.ConnectionResetByPeer,12250 .ENETUNREACH => return syscall.fail(error.NetworkUnreachable),
12270 .ETIMEDOUT => return error.Timeout,12251 .EFAULT => |err| return syscall.wsaErrorBug(err),
12271 .EHOSTUNREACH => return error.HostUnreachable,12252 .EINVAL => |err| return syscall.wsaErrorBug(err),
12272 .ENETUNREACH => return error.NetworkUnreachable,12253 .EISCONN => |err| return syscall.wsaErrorBug(err),
12273 .EFAULT => |err| return wsaErrorBug(err),12254 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12274 .EINVAL => |err| return wsaErrorBug(err),12255 .EWOULDBLOCK => return syscall.fail(error.WouldBlock),
12275 .EISCONN => |err| return wsaErrorBug(err),12256 .EACCES => return syscall.fail(error.AccessDenied),
12276 .ENOTSOCK => |err| return wsaErrorBug(err),12257 .ENOBUFS => return syscall.fail(error.SystemResources),
12277 .EWOULDBLOCK => return error.WouldBlock,12258 .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
12278 .EACCES => return error.AccessDenied,12259 else => |err| return syscall.unexpectedWsaError(err),
12279 .ENOBUFS => return error.SystemResources,
12280 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,
12281 else => |err| return windows.unexpectedWSAError(err),
12282 }
12283 },
12284 }12260 }
12285 }12261 }
1228612262
...@@ -12334,7 +12310,7 @@ fn netConnectUnixWindows(...@@ -12334,7 +12310,7 @@ fn netConnectUnixWindows(
12334 var storage: WsaAddress = undefined;12310 var storage: WsaAddress = undefined;
12335 const addr_len = addressUnixToWsa(address, &storage);12311 const addr_len = addressUnixToWsa(address, &storage);
1233612312
12337 var syscall: Syscall = try .start();12313 var syscall: AlertableSyscall = try .start();
12338 while (true) {12314 while (true) {
12339 const rc = ws2_32.connect(socket_handle, &storage.any, addr_len);12315 const rc = ws2_32.connect(socket_handle, &storage.any, addr_len);
12340 if (rc != ws2_32.SOCKET_ERROR) break;12316 if (rc != ws2_32.SOCKET_ERROR) break;
...@@ -12349,21 +12325,16 @@ fn netConnectUnixWindows(...@@ -12349,21 +12325,16 @@ fn netConnectUnixWindows(
12349 syscall = try .start();12325 syscall = try .start();
12350 continue;12326 continue;
12351 },12327 },
12352 else => |e| {12328 .ECONNREFUSED => return syscall.fail(error.FileNotFound),
12353 syscall.finish();12329 .EFAULT => |err| return syscall.wsaErrorBug(err),
12354 switch (e) {12330 .EINVAL => |err| return syscall.wsaErrorBug(err),
12355 .ECONNREFUSED => return error.FileNotFound,12331 .EISCONN => |err| return syscall.wsaErrorBug(err),
12356 .EFAULT => |err| return wsaErrorBug(err),12332 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12357 .EINVAL => |err| return wsaErrorBug(err),12333 .EWOULDBLOCK => return syscall.fail(error.WouldBlock),
12358 .EISCONN => |err| return wsaErrorBug(err),12334 .EACCES => return syscall.fail(error.AccessDenied),
12359 .ENOTSOCK => |err| return wsaErrorBug(err),12335 .ENOBUFS => return syscall.fail(error.SystemResources),
12360 .EWOULDBLOCK => return error.WouldBlock,12336 .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
12361 .EACCES => return error.AccessDenied,12337 else => |err| return syscall.unexpectedWsaError(err),
12362 .ENOBUFS => return error.SystemResources,
12363 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,
12364 else => |err| return windows.unexpectedWSAError(err),
12365 }
12366 },
12367 }12338 }
12368 }12339 }
1236912340
...@@ -12417,7 +12388,7 @@ fn netBindIpWindows(...@@ -12417,7 +12388,7 @@ fn netBindIpWindows(
12417 var storage: WsaAddress = undefined;12388 var storage: WsaAddress = undefined;
12418 var addr_len = addressToWsa(address, &storage);12389 var addr_len = addressToWsa(address, &storage);
1241912390
12420 var syscall: Syscall = try .start();12391 var syscall: AlertableSyscall = try .start();
12421 while (true) {12392 while (true) {
12422 const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);12393 const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);
12423 if (rc != ws2_32.SOCKET_ERROR) {12394 if (rc != ws2_32.SOCKET_ERROR) {
...@@ -12435,19 +12406,14 @@ fn netBindIpWindows(...@@ -12435,19 +12406,14 @@ fn netBindIpWindows(
12435 syscall = try .start();12406 syscall = try .start();
12436 continue;12407 continue;
12437 },12408 },
12438 else => |e| {12409 .EADDRINUSE => return syscall.fail(error.AddressInUse),
12439 syscall.finish();12410 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
12440 switch (e) {12411 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12441 .EADDRINUSE => return error.AddressInUse,12412 .EFAULT => |err| return syscall.wsaErrorBug(err),
12442 .EADDRNOTAVAIL => return error.AddressUnavailable,12413 .EINVAL => |err| return syscall.wsaErrorBug(err),
12443 .ENOTSOCK => |err| return wsaErrorBug(err),12414 .ENOBUFS => return syscall.fail(error.SystemResources),
12444 .EFAULT => |err| return wsaErrorBug(err),12415 .ENETDOWN => return syscall.fail(error.NetworkDown),
12445 .EINVAL => |err| return wsaErrorBug(err),12416 else => |err| return syscall.unexpectedWsaError(err),
12446 .ENOBUFS => return error.SystemResources,
12447 .ENETDOWN => return error.NetworkDown,
12448 else => |err| return windows.unexpectedWSAError(err),
12449 }
12450 },
12451 }12417 }
12452 }12418 }
1245312419
...@@ -12611,10 +12577,8 @@ fn openSocketWsa(...@@ -12611,10 +12577,8 @@ fn openSocketWsa(
12611 const protocol = posixProtocol(options.protocol);12577 const protocol = posixProtocol(options.protocol);
12612 // WSA_FLAG_OVERLAPPED is chosen here because without this different12578 // WSA_FLAG_OVERLAPPED is chosen here because without this different
12613 // threads cannot use the same open socket handle.12579 // threads cannot use the same open socket handle.
12614 // TODO: the below code needs to use the AlertableSyscall mechanism instead in
12615 // order to make cancelation work.
12616 const flags: u32 = ws2_32.WSA_FLAG_OVERLAPPED | ws2_32.WSA_FLAG_NO_HANDLE_INHERIT;12580 const flags: u32 = ws2_32.WSA_FLAG_OVERLAPPED | ws2_32.WSA_FLAG_NO_HANDLE_INHERIT;
12617 var syscall: Syscall = try .start();12581 var syscall: AlertableSyscall = try .start();
12618 while (true) {12582 while (true) {
12619 const rc = ws2_32.WSASocketW(family, @bitCast(mode), @bitCast(protocol), null, 0, flags);12583 const rc = ws2_32.WSASocketW(family, @bitCast(mode), @bitCast(protocol), null, 0, flags);
12620 if (rc != ws2_32.INVALID_SOCKET) {12584 if (rc != ws2_32.INVALID_SOCKET) {
...@@ -12632,16 +12596,11 @@ fn openSocketWsa(...@@ -12632,16 +12596,11 @@ fn openSocketWsa(
12632 syscall = try .start();12596 syscall = try .start();
12633 continue;12597 continue;
12634 },12598 },
12635 else => |e| {12599 .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
12636 syscall.finish();12600 .EMFILE => return syscall.fail(error.ProcessFdQuotaExceeded),
12637 switch (e) {12601 .ENOBUFS => return syscall.fail(error.SystemResources),
12638 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,12602 .EPROTONOSUPPORT => return syscall.fail(error.ProtocolUnsupportedByAddressFamily),
12639 .EMFILE => return error.ProcessFdQuotaExceeded,12603 else => |err| return syscall.unexpectedWsaError(err),
12640 .ENOBUFS => return error.SystemResources,
12641 .EPROTONOSUPPORT => return error.ProtocolUnsupportedByAddressFamily,
12642 else => |err| return windows.unexpectedWSAError(err),
12643 }
12644 },
12645 }12604 }
12646 }12605 }
12647}12606}
...@@ -12702,7 +12661,7 @@ fn netAcceptWindows(userdata: ?*anyopaque, listen_handle: net.Socket.Handle) net...@@ -12702,7 +12661,7 @@ fn netAcceptWindows(userdata: ?*anyopaque, listen_handle: net.Socket.Handle) net
12702 const t: *Threaded = @ptrCast(@alignCast(userdata));12661 const t: *Threaded = @ptrCast(@alignCast(userdata));
12703 var storage: WsaAddress = undefined;12662 var storage: WsaAddress = undefined;
12704 var addr_len: i32 = @sizeOf(WsaAddress);12663 var addr_len: i32 = @sizeOf(WsaAddress);
12705 var syscall: Syscall = try .start();12664 var syscall: AlertableSyscall = try .start();
12706 while (true) {12665 while (true) {
12707 const rc = ws2_32.accept(listen_handle, &storage.any, &addr_len);12666 const rc = ws2_32.accept(listen_handle, &storage.any, &addr_len);
12708 if (rc != ws2_32.INVALID_SOCKET) {12667 if (rc != ws2_32.INVALID_SOCKET) {
...@@ -12723,20 +12682,15 @@ fn netAcceptWindows(userdata: ?*anyopaque, listen_handle: net.Socket.Handle) net...@@ -12723,20 +12682,15 @@ fn netAcceptWindows(userdata: ?*anyopaque, listen_handle: net.Socket.Handle) net
12723 syscall = try .start();12682 syscall = try .start();
12724 continue;12683 continue;
12725 },12684 },
12726 else => |e| {12685 .ECONNRESET => return syscall.fail(error.ConnectionAborted),
12727 syscall.finish();12686 .EMFILE => return syscall.fail(error.ProcessFdQuotaExceeded),
12728 switch (e) {12687 .ENETDOWN => return syscall.fail(error.NetworkDown),
12729 .ECONNRESET => return error.ConnectionAborted,12688 .ENOBUFS => return syscall.fail(error.SystemResources),
12730 .EFAULT => |err| return wsaErrorBug(err),12689 .EFAULT => |err| return syscall.wsaErrorBug(err),
12731 .ENOTSOCK => |err| return wsaErrorBug(err),12690 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12732 .EINVAL => |err| return wsaErrorBug(err),12691 .EINVAL => |err| return syscall.wsaErrorBug(err),
12733 .EMFILE => return error.ProcessFdQuotaExceeded,12692 .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err),
12734 .ENETDOWN => return error.NetworkDown,12693 else => |err| return syscall.unexpectedWsaError(err),
12735 .ENOBUFS => return error.SystemResources,
12736 .EOPNOTSUPP => |err| return wsaErrorBug(err),
12737 else => |err| return windows.unexpectedWSAError(err),
12738 }
12739 },
12740 }12694 }
12741 }12695 }
12742}12696}
...@@ -12859,7 +12813,7 @@ fn netReadWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, data: [][]u8...@@ -12859,7 +12813,7 @@ fn netReadWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, data: [][]u8
12859 break :b bufs;12813 break :b bufs;
12860 };12814 };
1286112815
12862 var syscall: Syscall = try .start();12816 var syscall: AlertableSyscall = try .start();
12863 while (true) {12817 while (true) {
12864 var flags: u32 = 0;12818 var flags: u32 = 0;
12865 var n: u32 = undefined;12819 var n: u32 = undefined;
...@@ -12885,15 +12839,9 @@ fn netReadWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, data: [][]u8...@@ -12885,15 +12839,9 @@ fn netReadWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, data: [][]u8
12885 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),12839 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
12886 .ENOTCONN => return syscall.fail(error.SocketUnconnected),12840 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
12887 .EFAULT => unreachable, // a pointer is not completely contained in user address space.12841 .EFAULT => unreachable, // a pointer is not completely contained in user address space.
1288812842 .EINVAL => |err| return syscall.wsaErrorBug(err),
12889 else => |err| {12843 .EMSGSIZE => |err| return syscall.wsaErrorBug(err),
12890 syscall.finish();12844 else => |err| return syscall.unexpectedWsaError(err),
12891 switch (err) {
12892 .EINVAL => return wsaErrorBug(err),
12893 .EMSGSIZE => return wsaErrorBug(err),
12894 else => return windows.unexpectedWSAError(err),
12895 }
12896 },
12897 }12845 }
12898 }12846 }
12899}12847}
...@@ -12967,7 +12915,7 @@ fn netSendWindowsOne(...@@ -12967,7 +12915,7 @@ fn netSendWindowsOne(
12967 var n: u32 = undefined;12915 var n: u32 = undefined;
12968 var address: WsaAddress = undefined;12916 var address: WsaAddress = undefined;
12969 const address_size = addressToWsa(message.address, &address);12917 const address_size = addressToWsa(message.address, &address);
12970 var syscall: Syscall = try .start();12918 var syscall: AlertableSyscall = try .start();
12971 while (true) {12919 while (true) {
12972 const rc = ws2_32.WSASendTo(12920 const rc = ws2_32.WSASendTo(
12973 handle,12921 handle,
...@@ -13001,15 +12949,9 @@ fn netSendWindowsOne(...@@ -13001,15 +12949,9 @@ fn netSendWindowsOne(
13001 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),12949 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
13002 .ENOTCONN => return syscall.fail(error.SocketUnconnected),12950 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
13003 .EFAULT => unreachable, // a pointer is not completely contained in user address space.12951 .EFAULT => unreachable, // a pointer is not completely contained in user address space.
1300412952 .EINVAL => |err| return syscall.wsaErrorBug(err),
13005 else => |err| {12953 .EMSGSIZE => |err| return syscall.wsaErrorBug(err),
13006 syscall.finish();12954 else => |err| return syscall.unexpectedWsaError(err),
13007 switch (err) {
13008 .EINVAL => return wsaErrorBug(err),
13009 .EMSGSIZE => return wsaErrorBug(err),
13010 else => return windows.unexpectedWSAError(err),
13011 }
13012 },
13013 }12955 }
13014 }12956 }
13015}12957}
...@@ -13045,7 +12987,7 @@ fn netSendOne(...@@ -13045,7 +12987,7 @@ fn netSendOne(
13045 .controllen = @intCast(message.control.len),12987 .controllen = @intCast(message.control.len),
13046 .flags = 0,12988 .flags = 0,
13047 };12989 };
13048 var syscall: Syscall = try .start();12990 var syscall: if (is_windows) AlertableSyscall else Syscall = try .start();
13049 while (true) {12991 while (true) {
13050 const rc = posix.system.sendmsg(handle, &msg, flags);12992 const rc = posix.system.sendmsg(handle, &msg, flags);
13051 if (is_windows) {12993 if (is_windows) {
...@@ -13065,28 +13007,23 @@ fn netSendOne(...@@ -13065,28 +13007,23 @@ fn netSendOne(
13065 syscall = try .start();13007 syscall = try .start();
13066 continue;13008 continue;
13067 },13009 },
13068 else => |e| {13010 .EACCES => return syscall.fail(error.AccessDenied),
13069 syscall.finish();13011 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
13070 switch (e) {13012 .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
13071 .EACCES => return error.AccessDenied,13013 .EMSGSIZE => return syscall.fail(error.MessageOversize),
13072 .EADDRNOTAVAIL => return error.AddressUnavailable,13014 .ENOBUFS => return syscall.fail(error.SystemResources),
13073 .ECONNRESET => return error.ConnectionResetByPeer,13015 .ENOTSOCK => return syscall.fail(error.FileDescriptorNotASocket),
13074 .EMSGSIZE => return error.MessageOversize,13016 .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
13075 .ENOBUFS => return error.SystemResources,13017 .EHOSTUNREACH => return syscall.fail(error.NetworkUnreachable),
13076 .ENOTSOCK => return error.FileDescriptorNotASocket,13018 .ENETDOWN => return syscall.fail(error.NetworkDown),
13077 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,13019 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
13078 .EDESTADDRREQ => unreachable, // A destination address is required.13020 .ENETUNREACH => return syscall.fail(error.NetworkUnreachable),
13079 .EFAULT => unreachable, // The lpBuffers, lpTo, lpOverlapped, lpNumberOfBytesSent, or lpCompletionRoutine parameters are not part of the user address space, or the lpTo parameter is too small.13021 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
13080 .EHOSTUNREACH => return error.NetworkUnreachable,13022 .EDESTADDRREQ => unreachable, // A destination address is required.
13081 .EINVAL => unreachable,13023 .EFAULT => unreachable, // The lpBuffers, lpTo, lpOverlapped, lpNumberOfBytesSent, or lpCompletionRoutine parameters are not part of the user address space, or the lpTo parameter is too small.
13082 .ENETDOWN => return error.NetworkDown,13024 .EINVAL => unreachable,
13083 .ENETRESET => return error.ConnectionResetByPeer,13025 .ESHUTDOWN => |err| return syscall.wsaErrorBug(err),
13084 .ENETUNREACH => return error.NetworkUnreachable,13026 else => |err| return syscall.unexpectedWsaError(err),
13085 .ENOTCONN => return error.SocketUnconnected,
13086 .ESHUTDOWN => |err| return wsaErrorBug(err),
13087 else => |err| return windows.unexpectedWSAError(err),
13088 }
13089 },
13090 }13027 }
13091 }13028 }
13092 switch (posix.errno(rc)) {13029 switch (posix.errno(rc)) {
...@@ -13099,31 +13036,26 @@ fn netSendOne(...@@ -13099,31 +13036,26 @@ fn netSendOne(
13099 try syscall.checkCancel();13036 try syscall.checkCancel();
13100 continue;13037 continue;
13101 },13038 },
13102 else => |e| {13039 .ACCES => return syscall.fail(error.AccessDenied),
13103 syscall.finish();13040 .ALREADY => return syscall.fail(error.FastOpenAlreadyInProgress),
13104 switch (e) {13041 .CONNRESET => return syscall.fail(error.ConnectionResetByPeer),
13105 .ACCES => return error.AccessDenied,13042 .MSGSIZE => return syscall.fail(error.MessageOversize),
13106 .ALREADY => return error.FastOpenAlreadyInProgress,13043 .NOBUFS => return syscall.fail(error.SystemResources),
13107 .BADF => |err| return errnoBug(err), // File descriptor used after closed.13044 .NOMEM => return syscall.fail(error.SystemResources),
13108 .CONNRESET => return error.ConnectionResetByPeer,13045 .PIPE => return syscall.fail(error.SocketUnconnected),
13109 .DESTADDRREQ => |err| return errnoBug(err),13046 .AFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
13110 .FAULT => |err| return errnoBug(err),13047 .HOSTUNREACH => return syscall.fail(error.HostUnreachable),
13111 .INVAL => |err| return errnoBug(err),13048 .NETUNREACH => return syscall.fail(error.NetworkUnreachable),
13112 .ISCONN => |err| return errnoBug(err),13049 .NOTCONN => return syscall.fail(error.SocketUnconnected),
13113 .MSGSIZE => return error.MessageOversize,13050 .NETDOWN => return syscall.fail(error.NetworkDown),
13114 .NOBUFS => return error.SystemResources,13051 .BADF => |err| return syscall.errnoBug(err), // File descriptor used after closed.
13115 .NOMEM => return error.SystemResources,13052 .DESTADDRREQ => |err| return syscall.errnoBug(err),
13116 .NOTSOCK => |err| return errnoBug(err),13053 .FAULT => |err| return syscall.errnoBug(err),
13117 .OPNOTSUPP => |err| return errnoBug(err),13054 .INVAL => |err| return syscall.errnoBug(err),
13118 .PIPE => return error.SocketUnconnected,13055 .ISCONN => |err| return syscall.errnoBug(err),
13119 .AFNOSUPPORT => return error.AddressFamilyUnsupported,13056 .NOTSOCK => |err| return syscall.errnoBug(err),
13120 .HOSTUNREACH => return error.HostUnreachable,13057 .OPNOTSUPP => |err| return syscall.errnoBug(err),
13121 .NETUNREACH => return error.NetworkUnreachable,13058 else => |err| return syscall.unexpectedErrno(err),
13122 .NOTCONN => return error.SocketUnconnected,
13123 .NETDOWN => return error.NetworkDown,
13124 else => |err| return posix.unexpectedErrno(err),
13125 }
13126 },
13127 }13059 }
13128 }13060 }
13129}13061}
...@@ -13308,9 +13240,9 @@ fn netReceiveWindowsOne(...@@ -13308,9 +13240,9 @@ fn netReceiveWindowsOne(
13308 .len = std.math.cast(u32, data_buffer.len) orelse return error.MessageOversize,13240 .len = std.math.cast(u32, data_buffer.len) orelse return error.MessageOversize,
13309 };13241 };
13310 var n: u32 = undefined;13242 var n: u32 = undefined;
13311 var syscall: Syscall = try .start();
13312 var from_storage: WsaAddress = undefined;13243 var from_storage: WsaAddress = undefined;
13313 var from_storage_len: i32 = @sizeOf(WsaAddress);13244 var from_storage_len: i32 = @sizeOf(WsaAddress);
13245 var syscall: AlertableSyscall = try .start();
1331413246
13315 while (true) {13247 while (true) {
13316 const rc = ws2_32.WSARecvFrom(13248 const rc = ws2_32.WSARecvFrom(
...@@ -13351,21 +13283,14 @@ fn netReceiveWindowsOne(...@@ -13351,21 +13283,14 @@ fn netReceiveWindowsOne(
13351 syscall = try .start();13283 syscall = try .start();
13352 continue;13284 continue;
13353 },13285 },
13354
13355 .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),13286 .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
13356 .ENETDOWN => return syscall.fail(error.NetworkDown),13287 .ENETDOWN => return syscall.fail(error.NetworkDown),
13357 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),13288 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
13358 .ENOTCONN => return syscall.fail(error.SocketUnconnected),13289 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
13359 .EFAULT => unreachable, // a pointer is not completely contained in user address space.13290 .EFAULT => unreachable, // a pointer is not completely contained in user address space.
1336013291 .EINVAL => |err| return syscall.wsaErrorBug(err),
13361 else => |err| {13292 .EMSGSIZE => |err| return syscall.wsaErrorBug(err),
13362 syscall.finish();13293 else => |err| return syscall.unexpectedWsaError(err),
13363 switch (err) {
13364 .EINVAL => return wsaErrorBug(err),
13365 .EMSGSIZE => return wsaErrorBug(err),
13366 else => return windows.unexpectedWSAError(err),
13367 }
13368 },
13369 }13294 }
13370 }13295 }
13371}13296}
...@@ -13505,7 +13430,7 @@ fn netWriteWindows(...@@ -13505,7 +13430,7 @@ fn netWriteWindows(
13505 },13430 },
13506 };13431 };
1350713432
13508 var syscall: Syscall = try .start();13433 var syscall: AlertableSyscall = try .start();
13509 while (true) {13434 while (true) {
13510 var n: u32 = undefined;13435 var n: u32 = undefined;
13511 const rc = ws2_32.WSASend(handle, &iovecs, len, &n, 0, null, null);13436 const rc = ws2_32.WSASend(handle, &iovecs, len, &n, 0, null, null);
...@@ -13533,16 +13458,10 @@ fn netWriteWindows(...@@ -13533,16 +13458,10 @@ fn netWriteWindows(
13533 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),13458 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
13534 .ENOBUFS => return syscall.fail(error.SystemResources),13459 .ENOBUFS => return syscall.fail(error.SystemResources),
13535 .ENOTCONN => return syscall.fail(error.SocketUnconnected),13460 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
1353613461 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
13537 else => |err| {13462 .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err),
13538 syscall.finish();13463 .ESHUTDOWN => |err| return syscall.wsaErrorBug(err),
13539 switch (err) {13464 else => |err| return syscall.unexpectedWsaError(err),
13540 .ENOTSOCK => return wsaErrorBug(err),
13541 .EOPNOTSUPP => return wsaErrorBug(err),
13542 .ESHUTDOWN => return wsaErrorBug(err),
13543 else => return windows.unexpectedWSAError(err),
13544 }
13545 },
13546 }13465 }
13547 }13466 }
13548}13467}
...@@ -13651,7 +13570,7 @@ fn netShutdownWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, how: net...@@ -13651,7 +13570,7 @@ fn netShutdownWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, how: net
13651 .both => ws2_32.SD_BOTH,13570 .both => ws2_32.SD_BOTH,
13652 };13571 };
1365313572
13654 var syscall: Syscall = try .start();13573 var syscall: AlertableSyscall = try .start();
13655 while (true) {13574 while (true) {
13656 const rc = ws2_32.shutdown(handle, wsa_how);13575 const rc = ws2_32.shutdown(handle, wsa_how);
13657 if (rc != ws2_32.SOCKET_ERROR) {13576 if (rc != ws2_32.SOCKET_ERROR) {
...@@ -13669,17 +13588,12 @@ fn netShutdownWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, how: net...@@ -13669,17 +13588,12 @@ fn netShutdownWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, how: net
13669 syscall = try .start();13588 syscall = try .start();
13670 continue;13589 continue;
13671 },13590 },
13672 else => |e| {13591 .ECONNABORTED => return syscall.fail(error.ConnectionAborted),
13673 syscall.finish();13592 .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
13674 switch (e) {13593 .ENETDOWN => return syscall.fail(error.NetworkDown),
13675 .ECONNABORTED => return error.ConnectionAborted,13594 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
13676 .ECONNRESET => return error.ConnectionResetByPeer,13595 .EINVAL, .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
13677 .ENETDOWN => return error.NetworkDown,13596 else => |err| return syscall.unexpectedWsaError(err),
13678 .ENOTCONN => return error.SocketUnconnected,
13679 .EINVAL, .ENOTSOCK => |err| return wsaErrorBug(err),
13680 else => |err| return windows.unexpectedWSAError(err),
13681 }
13682 },
13683 }13597 }
13684 }13598 }
13685}13599}
...@@ -13866,14 +13780,14 @@ fn netLookupFallible(...@@ -13866,14 +13780,14 @@ fn netLookupFallible(
13866 continue;13780 continue;
13867 },13781 },
13868 .TRY_AGAIN => return error.NameServerFailure,13782 .TRY_AGAIN => return error.NameServerFailure,
13869 .EINVAL => |err| return wsaErrorBug(err),
13870 .NO_RECOVERY => return error.NameServerFailure,13783 .NO_RECOVERY => return error.NameServerFailure,
13871 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,13784 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,
13872 .NOT_ENOUGH_MEMORY => return error.SystemResources,13785 .NOT_ENOUGH_MEMORY => return error.SystemResources,
13873 .HOST_NOT_FOUND => return error.UnknownHostName,13786 .HOST_NOT_FOUND => return error.UnknownHostName,
13874 .TYPE_NOT_FOUND => return error.ProtocolUnsupportedByAddressFamily,13787 .TYPE_NOT_FOUND => return error.ProtocolUnsupportedByAddressFamily,
13875 .ESOCKTNOSUPPORT => return error.ProtocolUnsupportedBySystem,13788 .ESOCKTNOSUPPORT => return error.ProtocolUnsupportedBySystem,
13876 else => |err| return windows.unexpectedWSAError(err),13789 .EINVAL => |err| return windows.wsaErrorBug(err),
13790 else => |err| return windows.unexpectedWsaError(err),
13877 }13791 }
13878 }13792 }
13879 defer ws2_32.FreeAddrInfoExW(res);13793 defer ws2_32.FreeAddrInfoExW(res);
...@@ -14363,11 +14277,6 @@ pub fn errnoBug(err: posix.E) Io.UnexpectedError {...@@ -14363,11 +14277,6 @@ pub fn errnoBug(err: posix.E) Io.UnexpectedError {
14363 return error.Unexpected;14277 return error.Unexpected;
14364}14278}
1436514279
14366fn wsaErrorBug(err: ws2_32.WinsockError) Io.UnexpectedError {
14367 if (is_debug) std.debug.panic("programmer bug caused syscall error: {t}", .{err});
14368 return error.Unexpected;
14369}
14370
14371pub fn posixSocketMode(mode: net.Socket.Mode) u32 {14280pub fn posixSocketMode(mode: net.Socket.Mode) u32 {
14372 return switch (mode) {14281 return switch (mode) {
14373 .stream => posix.SOCK.STREAM,14282 .stream => posix.SOCK.STREAM,
...@@ -15003,7 +14912,7 @@ fn initializeWsa(t: *Threaded) error{ NetworkDown, Canceled }!void {...@@ -15003,7 +14912,7 @@ fn initializeWsa(t: *Threaded) error{ NetworkDown, Canceled }!void {
15003 .VERNOTSUPPORTED => error.VersionUnsupported,14912 .VERNOTSUPPORTED => error.VersionUnsupported,
15004 .EINPROGRESS => error.BlockingOperationInProgress,14913 .EINPROGRESS => error.BlockingOperationInProgress,
15005 .EPROCLIM => error.ProcessFdQuotaExceeded,14914 .EPROCLIM => error.ProcessFdQuotaExceeded,
15006 else => |err| windows.unexpectedWSAError(err),14915 else => |err| windows.unexpectedWsaError(err),
15007 };14916 };
15008 },14917 },
15009 }14918 }
lib/std/os/windows.zig+6-1
...@@ -3231,10 +3231,15 @@ pub fn unexpectedError(err: Win32Error) UnexpectedError {...@@ -3231,10 +3231,15 @@ pub fn unexpectedError(err: Win32Error) UnexpectedError {
3231 return error.Unexpected;3231 return error.Unexpected;
3232}3232}
32333233
3234pub fn unexpectedWSAError(err: ws2_32.WinsockError) UnexpectedError {3234pub fn unexpectedWsaError(err: ws2_32.WinsockError) UnexpectedError {
3235 return unexpectedError(@as(Win32Error, @enumFromInt(@intFromEnum(err))));3235 return unexpectedError(@as(Win32Error, @enumFromInt(@intFromEnum(err))));
3236}3236}
32373237
3238pub fn wsaErrorBug(err: ws2_32.WinsockError) UnexpectedError {
3239 if (builtin.mode == .Debug) std.debug.panic("programmer bug caused syscall error: {t}", .{err});
3240 return error.Unexpected;
3241}
3242
3238/// Call this when you made a windows NtDll call3243/// Call this when you made a windows NtDll call
3239/// and you get an unexpected status.3244/// and you get an unexpected status.
3240pub fn unexpectedStatus(status: NTSTATUS) UnexpectedError {3245pub fn unexpectedStatus(status: NTSTATUS) UnexpectedError {