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 {
14961496 s.finish();
14971497 return windows.unexpectedStatus(status);
14981498 }
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 }
14991511};
15001512
15011513pub fn waitForApcOrAlert() void {
......@@ -11692,7 +11704,7 @@ fn netListenIpWindows(
1169211704 var storage: WsaAddress = undefined;
1169311705 var addr_len = addressToWsa(&address, &storage);
1169411706
11695 var syscall: Syscall = try .start();
11707 var syscall: AlertableSyscall = try .start();
1169611708 while (true) {
1169711709 const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);
1169811710 if (rc != ws2_32.SOCKET_ERROR) {
......@@ -11710,19 +11722,14 @@ fn netListenIpWindows(
1171011722 try syscall.checkCancel();
1171111723 continue;
1171211724 },
11713 else => |e| {
11714 syscall.finish();
11715 switch (e) {
11716 .EADDRINUSE => return error.AddressInUse,
11717 .EADDRNOTAVAIL => return error.AddressUnavailable,
11718 .ENOTSOCK => |err| return wsaErrorBug(err),
11719 .EFAULT => |err| return wsaErrorBug(err),
11720 .EINVAL => |err| return wsaErrorBug(err),
11721 .ENOBUFS => return error.SystemResources,
11722 .ENETDOWN => return error.NetworkDown,
11723 else => |err| return windows.unexpectedWSAError(err),
11724 }
11725 },
11725 .EADDRINUSE => return syscall.fail(error.AddressInUse),
11726 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
11727 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
11728 .EFAULT => |err| return syscall.wsaErrorBug(err),
11729 .EINVAL => |err| return syscall.wsaErrorBug(err),
11730 .ENOBUFS => return syscall.fail(error.SystemResources),
11731 .ENETDOWN => return syscall.fail(error.NetworkDown),
11732 else => |err| return syscall.unexpectedWsaError(err),
1172611733 }
1172711734 }
1172811735
......@@ -11744,20 +11751,15 @@ fn netListenIpWindows(
1174411751 try syscall.checkCancel();
1174511752 continue;
1174611753 },
11747 else => |e| {
11748 syscall.finish();
11749 switch (e) {
11750 .ENETDOWN => return error.NetworkDown,
11751 .EADDRINUSE => return error.AddressInUse,
11752 .EISCONN => |err| return wsaErrorBug(err),
11753 .EINVAL => |err| return wsaErrorBug(err),
11754 .EMFILE, .ENOBUFS => return error.SystemResources,
11755 .ENOTSOCK => |err| return wsaErrorBug(err),
11756 .EOPNOTSUPP => |err| return wsaErrorBug(err),
11757 .EINPROGRESS => |err| return wsaErrorBug(err),
11758 else => |err| return windows.unexpectedWSAError(err),
11759 }
11760 },
11754 .ENETDOWN => return syscall.fail(error.NetworkDown),
11755 .EADDRINUSE => return syscall.fail(error.AddressInUse),
11756 .EMFILE, .ENOBUFS => return syscall.fail(error.SystemResources),
11757 .EISCONN => |err| return syscall.wsaErrorBug(err),
11758 .EINVAL => |err| return syscall.wsaErrorBug(err),
11759 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
11760 .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err),
11761 .EINPROGRESS => |err| return syscall.wsaErrorBug(err),
11762 else => |err| return syscall.unexpectedWsaError(err),
1176111763 }
1176211764 }
1176311765
......@@ -11841,7 +11843,7 @@ fn netListenUnixWindows(
1184111843 var storage: WsaAddress = undefined;
1184211844 const addr_len = addressUnixToWsa(address, &storage);
1184311845
11844 var syscall: Syscall = try .start();
11846 var syscall: AlertableSyscall = try .start();
1184511847 while (true) {
1184611848 const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);
1184711849 if (rc != ws2_32.SOCKET_ERROR) break;
......@@ -11856,19 +11858,14 @@ fn netListenUnixWindows(
1185611858 try syscall.checkCancel();
1185711859 continue;
1185811860 },
11859 else => |e| {
11860 syscall.finish();
11861 switch (e) {
11862 .EADDRINUSE => return error.AddressInUse,
11863 .EADDRNOTAVAIL => return error.AddressUnavailable,
11864 .ENOTSOCK => |err| return wsaErrorBug(err),
11865 .EFAULT => |err| return wsaErrorBug(err),
11866 .EINVAL => |err| return wsaErrorBug(err),
11867 .ENOBUFS => return error.SystemResources,
11868 .ENETDOWN => return error.NetworkDown,
11869 else => |err| return windows.unexpectedWSAError(err),
11870 }
11871 },
11861 .EADDRINUSE => return syscall.fail(error.AddressInUse),
11862 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
11863 .ENOBUFS => return syscall.fail(error.SystemResources),
11864 .ENETDOWN => return syscall.fail(error.NetworkDown),
11865 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
11866 .EFAULT => |err| return syscall.wsaErrorBug(err),
11867 .EINVAL => |err| return syscall.wsaErrorBug(err),
11868 else => |err| return syscall.unexpectedWsaError(err),
1187211869 }
1187311870 }
1187411871
......@@ -11887,20 +11884,15 @@ fn netListenUnixWindows(
1188711884 syscall = try .start();
1188811885 continue;
1188911886 },
11890 else => |e| {
11891 syscall.finish();
11892 switch (e) {
11893 .ENETDOWN => return error.NetworkDown,
11894 .EADDRINUSE => return error.AddressInUse,
11895 .EISCONN => |err| return wsaErrorBug(err),
11896 .EINVAL => |err| return wsaErrorBug(err),
11897 .EMFILE, .ENOBUFS => return error.SystemResources,
11898 .ENOTSOCK => |err| return wsaErrorBug(err),
11899 .EOPNOTSUPP => |err| return wsaErrorBug(err),
11900 .EINPROGRESS => |err| return wsaErrorBug(err),
11901 else => |err| return windows.unexpectedWSAError(err),
11902 }
11903 },
11887 .ENETDOWN => return syscall.fail(error.NetworkDown),
11888 .EADDRINUSE => return syscall.fail(error.AddressInUse),
11889 .EMFILE, .ENOBUFS => return syscall.fail(error.SystemResources),
11890 .EISCONN => |err| return syscall.wsaErrorBug(err),
11891 .EINVAL => |err| return syscall.wsaErrorBug(err),
11892 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
11893 .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err),
11894 .EINPROGRESS => |err| return syscall.wsaErrorBug(err),
11895 else => |err| return syscall.unexpectedWsaError(err),
1190411896 }
1190511897 }
1190611898}
......@@ -12111,7 +12103,7 @@ fn wsaGetSockName(
1211112103 addr: *ws2_32.sockaddr,
1211212104 addr_len: *i32,
1211312105) !void {
12114 var syscall: Syscall = try .start();
12106 var syscall: AlertableSyscall = try .start();
1211512107 while (true) {
1211612108 const rc = ws2_32.getsockname(handle, addr, addr_len);
1211712109 if (rc != ws2_32.SOCKET_ERROR) {
......@@ -12129,16 +12121,11 @@ fn wsaGetSockName(
1212912121 syscall = try .start();
1213012122 continue;
1213112123 },
12132 else => |e| {
12133 syscall.finish();
12134 switch (e) {
12135 .ENETDOWN => return error.NetworkDown,
12136 .EFAULT => |err| return wsaErrorBug(err),
12137 .ENOTSOCK => |err| return wsaErrorBug(err),
12138 .EINVAL => |err| return wsaErrorBug(err),
12139 else => |err| return windows.unexpectedWSAError(err),
12140 }
12141 },
12124 .ENETDOWN => return syscall.fail(error.NetworkDown),
12125 .EFAULT => |err| return syscall.wsaErrorBug(err),
12126 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12127 .EINVAL => |err| return syscall.wsaErrorBug(err),
12128 else => |err| return syscall.unexpectedWsaError(err),
1214212129 }
1214312130 }
1214412131}
......@@ -12172,7 +12159,7 @@ fn setSocketOption(fd: posix.fd_t, level: i32, opt_name: u32, option: u32) !void
1217212159
1217312160fn setSocketOptionWsa(t: *Threaded, socket: Io.net.Socket.Handle, level: i32, opt_name: u32, option: u32) !void {
1217412161 const o: []const u8 = @ptrCast(&option);
12175 var syscall: Syscall = try .start();
12162 var syscall: AlertableSyscall = try .start();
1217612163 const rc = ws2_32.setsockopt(socket, level, @bitCast(opt_name), o.ptr, @intCast(o.len));
1217712164 while (true) {
1217812165 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
1218812175 continue;
1218912176 },
1219012177 .ENETDOWN => return syscall.fail(error.NetworkDown),
12191 .EFAULT, .ENOTSOCK, .EINVAL => |err| {
12192 syscall.finish();
12193 return wsaErrorBug(err);
12194 },
12195 else => |err| {
12196 syscall.finish();
12197 return windows.unexpectedWSAError(err);
12198 },
12178 .EFAULT, .ENOTSOCK, .EINVAL => |err| return syscall.wsaErrorBug(err),
12179 else => |err| return syscall.unexpectedWsaError(err),
1219912180 }
1220012181 }
1220112182}
......@@ -12243,7 +12224,7 @@ fn netConnectIpWindows(
1224312224 var storage: WsaAddress = undefined;
1224412225 var addr_len = addressToWsa(address, &storage);
1224512226
12246 var syscall: Syscall = try .start();
12227 var syscall: AlertableSyscall = try .start();
1224712228 while (true) {
1224812229 const rc = ws2_32.connect(socket_handle, &storage.any, addr_len);
1224912230 if (rc != ws2_32.SOCKET_ERROR) {
......@@ -12261,26 +12242,21 @@ fn netConnectIpWindows(
1226112242 syscall = try .start();
1226212243 continue;
1226312244 },
12264 else => |e| {
12265 syscall.finish();
12266 switch (e) {
12267 .EADDRNOTAVAIL => return error.AddressUnavailable,
12268 .ECONNREFUSED => return error.ConnectionRefused,
12269 .ECONNRESET => return error.ConnectionResetByPeer,
12270 .ETIMEDOUT => return error.Timeout,
12271 .EHOSTUNREACH => return error.HostUnreachable,
12272 .ENETUNREACH => return error.NetworkUnreachable,
12273 .EFAULT => |err| return wsaErrorBug(err),
12274 .EINVAL => |err| return wsaErrorBug(err),
12275 .EISCONN => |err| return wsaErrorBug(err),
12276 .ENOTSOCK => |err| return wsaErrorBug(err),
12277 .EWOULDBLOCK => return error.WouldBlock,
12278 .EACCES => return error.AccessDenied,
12279 .ENOBUFS => return error.SystemResources,
12280 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,
12281 else => |err| return windows.unexpectedWSAError(err),
12282 }
12283 },
12245 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
12246 .ECONNREFUSED => return syscall.fail(error.ConnectionRefused),
12247 .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
12248 .ETIMEDOUT => return syscall.fail(error.Timeout),
12249 .EHOSTUNREACH => return syscall.fail(error.HostUnreachable),
12250 .ENETUNREACH => return syscall.fail(error.NetworkUnreachable),
12251 .EFAULT => |err| return syscall.wsaErrorBug(err),
12252 .EINVAL => |err| return syscall.wsaErrorBug(err),
12253 .EISCONN => |err| return syscall.wsaErrorBug(err),
12254 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12255 .EWOULDBLOCK => return syscall.fail(error.WouldBlock),
12256 .EACCES => return syscall.fail(error.AccessDenied),
12257 .ENOBUFS => return syscall.fail(error.SystemResources),
12258 .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
12259 else => |err| return syscall.unexpectedWsaError(err),
1228412260 }
1228512261 }
1228612262
......@@ -12334,7 +12310,7 @@ fn netConnectUnixWindows(
1233412310 var storage: WsaAddress = undefined;
1233512311 const addr_len = addressUnixToWsa(address, &storage);
1233612312
12337 var syscall: Syscall = try .start();
12313 var syscall: AlertableSyscall = try .start();
1233812314 while (true) {
1233912315 const rc = ws2_32.connect(socket_handle, &storage.any, addr_len);
1234012316 if (rc != ws2_32.SOCKET_ERROR) break;
......@@ -12349,21 +12325,16 @@ fn netConnectUnixWindows(
1234912325 syscall = try .start();
1235012326 continue;
1235112327 },
12352 else => |e| {
12353 syscall.finish();
12354 switch (e) {
12355 .ECONNREFUSED => return error.FileNotFound,
12356 .EFAULT => |err| return wsaErrorBug(err),
12357 .EINVAL => |err| return wsaErrorBug(err),
12358 .EISCONN => |err| return wsaErrorBug(err),
12359 .ENOTSOCK => |err| return wsaErrorBug(err),
12360 .EWOULDBLOCK => return error.WouldBlock,
12361 .EACCES => return error.AccessDenied,
12362 .ENOBUFS => return error.SystemResources,
12363 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,
12364 else => |err| return windows.unexpectedWSAError(err),
12365 }
12366 },
12328 .ECONNREFUSED => return syscall.fail(error.FileNotFound),
12329 .EFAULT => |err| return syscall.wsaErrorBug(err),
12330 .EINVAL => |err| return syscall.wsaErrorBug(err),
12331 .EISCONN => |err| return syscall.wsaErrorBug(err),
12332 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12333 .EWOULDBLOCK => return syscall.fail(error.WouldBlock),
12334 .EACCES => return syscall.fail(error.AccessDenied),
12335 .ENOBUFS => return syscall.fail(error.SystemResources),
12336 .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
12337 else => |err| return syscall.unexpectedWsaError(err),
1236712338 }
1236812339 }
1236912340
......@@ -12417,7 +12388,7 @@ fn netBindIpWindows(
1241712388 var storage: WsaAddress = undefined;
1241812389 var addr_len = addressToWsa(address, &storage);
1241912390
12420 var syscall: Syscall = try .start();
12391 var syscall: AlertableSyscall = try .start();
1242112392 while (true) {
1242212393 const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);
1242312394 if (rc != ws2_32.SOCKET_ERROR) {
......@@ -12435,19 +12406,14 @@ fn netBindIpWindows(
1243512406 syscall = try .start();
1243612407 continue;
1243712408 },
12438 else => |e| {
12439 syscall.finish();
12440 switch (e) {
12441 .EADDRINUSE => return error.AddressInUse,
12442 .EADDRNOTAVAIL => return error.AddressUnavailable,
12443 .ENOTSOCK => |err| return wsaErrorBug(err),
12444 .EFAULT => |err| return wsaErrorBug(err),
12445 .EINVAL => |err| return wsaErrorBug(err),
12446 .ENOBUFS => return error.SystemResources,
12447 .ENETDOWN => return error.NetworkDown,
12448 else => |err| return windows.unexpectedWSAError(err),
12449 }
12450 },
12409 .EADDRINUSE => return syscall.fail(error.AddressInUse),
12410 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
12411 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12412 .EFAULT => |err| return syscall.wsaErrorBug(err),
12413 .EINVAL => |err| return syscall.wsaErrorBug(err),
12414 .ENOBUFS => return syscall.fail(error.SystemResources),
12415 .ENETDOWN => return syscall.fail(error.NetworkDown),
12416 else => |err| return syscall.unexpectedWsaError(err),
1245112417 }
1245212418 }
1245312419
......@@ -12611,10 +12577,8 @@ fn openSocketWsa(
1261112577 const protocol = posixProtocol(options.protocol);
1261212578 // WSA_FLAG_OVERLAPPED is chosen here because without this different
1261312579 // 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.
1261612580 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();
1261812582 while (true) {
1261912583 const rc = ws2_32.WSASocketW(family, @bitCast(mode), @bitCast(protocol), null, 0, flags);
1262012584 if (rc != ws2_32.INVALID_SOCKET) {
......@@ -12632,16 +12596,11 @@ fn openSocketWsa(
1263212596 syscall = try .start();
1263312597 continue;
1263412598 },
12635 else => |e| {
12636 syscall.finish();
12637 switch (e) {
12638 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,
12639 .EMFILE => return error.ProcessFdQuotaExceeded,
12640 .ENOBUFS => return error.SystemResources,
12641 .EPROTONOSUPPORT => return error.ProtocolUnsupportedByAddressFamily,
12642 else => |err| return windows.unexpectedWSAError(err),
12643 }
12644 },
12599 .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
12600 .EMFILE => return syscall.fail(error.ProcessFdQuotaExceeded),
12601 .ENOBUFS => return syscall.fail(error.SystemResources),
12602 .EPROTONOSUPPORT => return syscall.fail(error.ProtocolUnsupportedByAddressFamily),
12603 else => |err| return syscall.unexpectedWsaError(err),
1264512604 }
1264612605 }
1264712606}
......@@ -12702,7 +12661,7 @@ fn netAcceptWindows(userdata: ?*anyopaque, listen_handle: net.Socket.Handle) net
1270212661 const t: *Threaded = @ptrCast(@alignCast(userdata));
1270312662 var storage: WsaAddress = undefined;
1270412663 var addr_len: i32 = @sizeOf(WsaAddress);
12705 var syscall: Syscall = try .start();
12664 var syscall: AlertableSyscall = try .start();
1270612665 while (true) {
1270712666 const rc = ws2_32.accept(listen_handle, &storage.any, &addr_len);
1270812667 if (rc != ws2_32.INVALID_SOCKET) {
......@@ -12723,20 +12682,15 @@ fn netAcceptWindows(userdata: ?*anyopaque, listen_handle: net.Socket.Handle) net
1272312682 syscall = try .start();
1272412683 continue;
1272512684 },
12726 else => |e| {
12727 syscall.finish();
12728 switch (e) {
12729 .ECONNRESET => return error.ConnectionAborted,
12730 .EFAULT => |err| return wsaErrorBug(err),
12731 .ENOTSOCK => |err| return wsaErrorBug(err),
12732 .EINVAL => |err| return wsaErrorBug(err),
12733 .EMFILE => return error.ProcessFdQuotaExceeded,
12734 .ENETDOWN => return error.NetworkDown,
12735 .ENOBUFS => return error.SystemResources,
12736 .EOPNOTSUPP => |err| return wsaErrorBug(err),
12737 else => |err| return windows.unexpectedWSAError(err),
12738 }
12739 },
12685 .ECONNRESET => return syscall.fail(error.ConnectionAborted),
12686 .EMFILE => return syscall.fail(error.ProcessFdQuotaExceeded),
12687 .ENETDOWN => return syscall.fail(error.NetworkDown),
12688 .ENOBUFS => return syscall.fail(error.SystemResources),
12689 .EFAULT => |err| return syscall.wsaErrorBug(err),
12690 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
12691 .EINVAL => |err| return syscall.wsaErrorBug(err),
12692 .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err),
12693 else => |err| return syscall.unexpectedWsaError(err),
1274012694 }
1274112695 }
1274212696}
......@@ -12859,7 +12813,7 @@ fn netReadWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, data: [][]u8
1285912813 break :b bufs;
1286012814 };
1286112815
12862 var syscall: Syscall = try .start();
12816 var syscall: AlertableSyscall = try .start();
1286312817 while (true) {
1286412818 var flags: u32 = 0;
1286512819 var n: u32 = undefined;
......@@ -12885,15 +12839,9 @@ fn netReadWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, data: [][]u8
1288512839 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
1288612840 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
1288712841 .EFAULT => unreachable, // a pointer is not completely contained in user address space.
12888
12889 else => |err| {
12890 syscall.finish();
12891 switch (err) {
12892 .EINVAL => return wsaErrorBug(err),
12893 .EMSGSIZE => return wsaErrorBug(err),
12894 else => return windows.unexpectedWSAError(err),
12895 }
12896 },
12842 .EINVAL => |err| return syscall.wsaErrorBug(err),
12843 .EMSGSIZE => |err| return syscall.wsaErrorBug(err),
12844 else => |err| return syscall.unexpectedWsaError(err),
1289712845 }
1289812846 }
1289912847}
......@@ -12967,7 +12915,7 @@ fn netSendWindowsOne(
1296712915 var n: u32 = undefined;
1296812916 var address: WsaAddress = undefined;
1296912917 const address_size = addressToWsa(message.address, &address);
12970 var syscall: Syscall = try .start();
12918 var syscall: AlertableSyscall = try .start();
1297112919 while (true) {
1297212920 const rc = ws2_32.WSASendTo(
1297312921 handle,
......@@ -13001,15 +12949,9 @@ fn netSendWindowsOne(
1300112949 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
1300212950 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
1300312951 .EFAULT => unreachable, // a pointer is not completely contained in user address space.
13004
13005 else => |err| {
13006 syscall.finish();
13007 switch (err) {
13008 .EINVAL => return wsaErrorBug(err),
13009 .EMSGSIZE => return wsaErrorBug(err),
13010 else => return windows.unexpectedWSAError(err),
13011 }
13012 },
12952 .EINVAL => |err| return syscall.wsaErrorBug(err),
12953 .EMSGSIZE => |err| return syscall.wsaErrorBug(err),
12954 else => |err| return syscall.unexpectedWsaError(err),
1301312955 }
1301412956 }
1301512957}
......@@ -13045,7 +12987,7 @@ fn netSendOne(
1304512987 .controllen = @intCast(message.control.len),
1304612988 .flags = 0,
1304712989 };
13048 var syscall: Syscall = try .start();
12990 var syscall: if (is_windows) AlertableSyscall else Syscall = try .start();
1304912991 while (true) {
1305012992 const rc = posix.system.sendmsg(handle, &msg, flags);
1305112993 if (is_windows) {
......@@ -13065,28 +13007,23 @@ fn netSendOne(
1306513007 syscall = try .start();
1306613008 continue;
1306713009 },
13068 else => |e| {
13069 syscall.finish();
13070 switch (e) {
13071 .EACCES => return error.AccessDenied,
13072 .EADDRNOTAVAIL => return error.AddressUnavailable,
13073 .ECONNRESET => return error.ConnectionResetByPeer,
13074 .EMSGSIZE => return error.MessageOversize,
13075 .ENOBUFS => return error.SystemResources,
13076 .ENOTSOCK => return error.FileDescriptorNotASocket,
13077 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,
13078 .EDESTADDRREQ => unreachable, // A destination address is required.
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.
13080 .EHOSTUNREACH => return error.NetworkUnreachable,
13081 .EINVAL => unreachable,
13082 .ENETDOWN => return error.NetworkDown,
13083 .ENETRESET => return error.ConnectionResetByPeer,
13084 .ENETUNREACH => return error.NetworkUnreachable,
13085 .ENOTCONN => return error.SocketUnconnected,
13086 .ESHUTDOWN => |err| return wsaErrorBug(err),
13087 else => |err| return windows.unexpectedWSAError(err),
13088 }
13089 },
13010 .EACCES => return syscall.fail(error.AccessDenied),
13011 .EADDRNOTAVAIL => return syscall.fail(error.AddressUnavailable),
13012 .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
13013 .EMSGSIZE => return syscall.fail(error.MessageOversize),
13014 .ENOBUFS => return syscall.fail(error.SystemResources),
13015 .ENOTSOCK => return syscall.fail(error.FileDescriptorNotASocket),
13016 .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
13017 .EHOSTUNREACH => return syscall.fail(error.NetworkUnreachable),
13018 .ENETDOWN => return syscall.fail(error.NetworkDown),
13019 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
13020 .ENETUNREACH => return syscall.fail(error.NetworkUnreachable),
13021 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
13022 .EDESTADDRREQ => unreachable, // A destination address is required.
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.
13024 .EINVAL => unreachable,
13025 .ESHUTDOWN => |err| return syscall.wsaErrorBug(err),
13026 else => |err| return syscall.unexpectedWsaError(err),
1309013027 }
1309113028 }
1309213029 switch (posix.errno(rc)) {
......@@ -13099,31 +13036,26 @@ fn netSendOne(
1309913036 try syscall.checkCancel();
1310013037 continue;
1310113038 },
13102 else => |e| {
13103 syscall.finish();
13104 switch (e) {
13105 .ACCES => return error.AccessDenied,
13106 .ALREADY => return error.FastOpenAlreadyInProgress,
13107 .BADF => |err| return errnoBug(err), // File descriptor used after closed.
13108 .CONNRESET => return error.ConnectionResetByPeer,
13109 .DESTADDRREQ => |err| return errnoBug(err),
13110 .FAULT => |err| return errnoBug(err),
13111 .INVAL => |err| return errnoBug(err),
13112 .ISCONN => |err| return errnoBug(err),
13113 .MSGSIZE => return error.MessageOversize,
13114 .NOBUFS => return error.SystemResources,
13115 .NOMEM => return error.SystemResources,
13116 .NOTSOCK => |err| return errnoBug(err),
13117 .OPNOTSUPP => |err| return errnoBug(err),
13118 .PIPE => return error.SocketUnconnected,
13119 .AFNOSUPPORT => return error.AddressFamilyUnsupported,
13120 .HOSTUNREACH => return error.HostUnreachable,
13121 .NETUNREACH => return error.NetworkUnreachable,
13122 .NOTCONN => return error.SocketUnconnected,
13123 .NETDOWN => return error.NetworkDown,
13124 else => |err| return posix.unexpectedErrno(err),
13125 }
13126 },
13039 .ACCES => return syscall.fail(error.AccessDenied),
13040 .ALREADY => return syscall.fail(error.FastOpenAlreadyInProgress),
13041 .CONNRESET => return syscall.fail(error.ConnectionResetByPeer),
13042 .MSGSIZE => return syscall.fail(error.MessageOversize),
13043 .NOBUFS => return syscall.fail(error.SystemResources),
13044 .NOMEM => return syscall.fail(error.SystemResources),
13045 .PIPE => return syscall.fail(error.SocketUnconnected),
13046 .AFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported),
13047 .HOSTUNREACH => return syscall.fail(error.HostUnreachable),
13048 .NETUNREACH => return syscall.fail(error.NetworkUnreachable),
13049 .NOTCONN => return syscall.fail(error.SocketUnconnected),
13050 .NETDOWN => return syscall.fail(error.NetworkDown),
13051 .BADF => |err| return syscall.errnoBug(err), // File descriptor used after closed.
13052 .DESTADDRREQ => |err| return syscall.errnoBug(err),
13053 .FAULT => |err| return syscall.errnoBug(err),
13054 .INVAL => |err| return syscall.errnoBug(err),
13055 .ISCONN => |err| return syscall.errnoBug(err),
13056 .NOTSOCK => |err| return syscall.errnoBug(err),
13057 .OPNOTSUPP => |err| return syscall.errnoBug(err),
13058 else => |err| return syscall.unexpectedErrno(err),
1312713059 }
1312813060 }
1312913061}
......@@ -13308,9 +13240,9 @@ fn netReceiveWindowsOne(
1330813240 .len = std.math.cast(u32, data_buffer.len) orelse return error.MessageOversize,
1330913241 };
1331013242 var n: u32 = undefined;
13311 var syscall: Syscall = try .start();
1331213243 var from_storage: WsaAddress = undefined;
1331313244 var from_storage_len: i32 = @sizeOf(WsaAddress);
13245 var syscall: AlertableSyscall = try .start();
1331413246
1331513247 while (true) {
1331613248 const rc = ws2_32.WSARecvFrom(
......@@ -13351,21 +13283,14 @@ fn netReceiveWindowsOne(
1335113283 syscall = try .start();
1335213284 continue;
1335313285 },
13354
1335513286 .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
1335613287 .ENETDOWN => return syscall.fail(error.NetworkDown),
1335713288 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
1335813289 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
1335913290 .EFAULT => unreachable, // a pointer is not completely contained in user address space.
13360
13361 else => |err| {
13362 syscall.finish();
13363 switch (err) {
13364 .EINVAL => return wsaErrorBug(err),
13365 .EMSGSIZE => return wsaErrorBug(err),
13366 else => return windows.unexpectedWSAError(err),
13367 }
13368 },
13291 .EINVAL => |err| return syscall.wsaErrorBug(err),
13292 .EMSGSIZE => |err| return syscall.wsaErrorBug(err),
13293 else => |err| return syscall.unexpectedWsaError(err),
1336913294 }
1337013295 }
1337113296}
......@@ -13505,7 +13430,7 @@ fn netWriteWindows(
1350513430 },
1350613431 };
1350713432
13508 var syscall: Syscall = try .start();
13433 var syscall: AlertableSyscall = try .start();
1350913434 while (true) {
1351013435 var n: u32 = undefined;
1351113436 const rc = ws2_32.WSASend(handle, &iovecs, len, &n, 0, null, null);
......@@ -13533,16 +13458,10 @@ fn netWriteWindows(
1353313458 .ENETRESET => return syscall.fail(error.ConnectionResetByPeer),
1353413459 .ENOBUFS => return syscall.fail(error.SystemResources),
1353513460 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
13536
13537 else => |err| {
13538 syscall.finish();
13539 switch (err) {
13540 .ENOTSOCK => return wsaErrorBug(err),
13541 .EOPNOTSUPP => return wsaErrorBug(err),
13542 .ESHUTDOWN => return wsaErrorBug(err),
13543 else => return windows.unexpectedWSAError(err),
13544 }
13545 },
13461 .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
13462 .EOPNOTSUPP => |err| return syscall.wsaErrorBug(err),
13463 .ESHUTDOWN => |err| return syscall.wsaErrorBug(err),
13464 else => |err| return syscall.unexpectedWsaError(err),
1354613465 }
1354713466 }
1354813467}
......@@ -13651,7 +13570,7 @@ fn netShutdownWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, how: net
1365113570 .both => ws2_32.SD_BOTH,
1365213571 };
1365313572
13654 var syscall: Syscall = try .start();
13573 var syscall: AlertableSyscall = try .start();
1365513574 while (true) {
1365613575 const rc = ws2_32.shutdown(handle, wsa_how);
1365713576 if (rc != ws2_32.SOCKET_ERROR) {
......@@ -13669,17 +13588,12 @@ fn netShutdownWindows(userdata: ?*anyopaque, handle: net.Socket.Handle, how: net
1366913588 syscall = try .start();
1367013589 continue;
1367113590 },
13672 else => |e| {
13673 syscall.finish();
13674 switch (e) {
13675 .ECONNABORTED => return error.ConnectionAborted,
13676 .ECONNRESET => return error.ConnectionResetByPeer,
13677 .ENETDOWN => return error.NetworkDown,
13678 .ENOTCONN => return error.SocketUnconnected,
13679 .EINVAL, .ENOTSOCK => |err| return wsaErrorBug(err),
13680 else => |err| return windows.unexpectedWSAError(err),
13681 }
13682 },
13591 .ECONNABORTED => return syscall.fail(error.ConnectionAborted),
13592 .ECONNRESET => return syscall.fail(error.ConnectionResetByPeer),
13593 .ENETDOWN => return syscall.fail(error.NetworkDown),
13594 .ENOTCONN => return syscall.fail(error.SocketUnconnected),
13595 .EINVAL, .ENOTSOCK => |err| return syscall.wsaErrorBug(err),
13596 else => |err| return syscall.unexpectedWsaError(err),
1368313597 }
1368413598 }
1368513599}
......@@ -13866,14 +13780,14 @@ fn netLookupFallible(
1386613780 continue;
1386713781 },
1386813782 .TRY_AGAIN => return error.NameServerFailure,
13869 .EINVAL => |err| return wsaErrorBug(err),
1387013783 .NO_RECOVERY => return error.NameServerFailure,
1387113784 .EAFNOSUPPORT => return error.AddressFamilyUnsupported,
1387213785 .NOT_ENOUGH_MEMORY => return error.SystemResources,
1387313786 .HOST_NOT_FOUND => return error.UnknownHostName,
1387413787 .TYPE_NOT_FOUND => return error.ProtocolUnsupportedByAddressFamily,
1387513788 .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),
1387713791 }
1387813792 }
1387913793 defer ws2_32.FreeAddrInfoExW(res);
......@@ -14363,11 +14277,6 @@ pub fn errnoBug(err: posix.E) Io.UnexpectedError {
1436314277 return error.Unexpected;
1436414278}
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
1437114280pub fn posixSocketMode(mode: net.Socket.Mode) u32 {
1437214281 return switch (mode) {
1437314282 .stream => posix.SOCK.STREAM,
......@@ -15003,7 +14912,7 @@ fn initializeWsa(t: *Threaded) error{ NetworkDown, Canceled }!void {
1500314912 .VERNOTSUPPORTED => error.VersionUnsupported,
1500414913 .EINPROGRESS => error.BlockingOperationInProgress,
1500514914 .EPROCLIM => error.ProcessFdQuotaExceeded,
15006 else => |err| windows.unexpectedWSAError(err),
14915 else => |err| windows.unexpectedWsaError(err),
1500714916 };
1500814917 },
1500914918 }
lib/std/os/windows.zig+6-1
......@@ -3231,10 +3231,15 @@ pub fn unexpectedError(err: Win32Error) UnexpectedError {
32313231 return error.Unexpected;
32323232}
32333233
3234pub fn unexpectedWSAError(err: ws2_32.WinsockError) UnexpectedError {
3234pub fn unexpectedWsaError(err: ws2_32.WinsockError) UnexpectedError {
32353235 return unexpectedError(@as(Win32Error, @enumFromInt(@intFromEnum(err))));
32363236}
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
32383243/// Call this when you made a windows NtDll call
32393244/// and you get an unexpected status.
32403245pub fn unexpectedStatus(status: NTSTATUS) UnexpectedError {