authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-02 16:12:55-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2019-12-02 16:12:55-05:00
logb7be57766b8c6d7fee27fd7c23e8c999a134bb27
treecadd0d933c1a189ddd2f02a534ca389eb3057587
parent55202a021a2b30271a94d3c63a43a00ff4a56f63
parent8a71f77c4a094c98c57fc3a3332bb4e17ed6febf
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #3715 from daurnimator/towards-afd

Misc windows additions+fixes

9 files changed, 313 insertions(+), 85 deletions(-)

lib/std/child_process.zig+1-1
......@@ -235,7 +235,7 @@ pub const ChildProcess = struct {
235235 }
236236
237237 fn waitUnwrappedWindows(self: *ChildProcess) !void {
238 const result = windows.WaitForSingleObject(self.handle, windows.INFINITE);
238 const result = windows.WaitForSingleObjectEx(self.handle, windows.INFINITE, false);
239239
240240 self.term = @as(SpawnError!Term, x: {
241241 var exit_code: windows.DWORD = undefined;
lib/std/os/bits/windows.zig+56-72
......@@ -1,6 +1,7 @@
11// The reference for these types and values is Microsoft Windows's ucrt (Universal C RunTime).
22
33usingnamespace @import("../windows/bits.zig");
4const ws2_32 = @import("../windows/ws2_32.zig");
45
56pub const fd_t = HANDLE;
67pub const pid_t = HANDLE;
......@@ -163,80 +164,63 @@ pub const F_OK = 0;
163164pub const AT_REMOVEDIR = 0x200;
164165
165166pub const in_port_t = u16;
166pub const sa_family_t = u16;
167pub const sa_family_t = ws2_32.ADDRESS_FAMILY;
167168pub const socklen_t = u32;
168169
169pub const sockaddr = extern struct {
170 family: sa_family_t,
171 data: [14]u8,
172};
173pub const sockaddr_in = extern struct {
174 family: sa_family_t = AF_INET,
175 port: in_port_t,
176 addr: in_addr,
177 zero: [8]u8 = [8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
178};
179pub const sockaddr_in6 = extern struct {
180 family: sa_family_t = AF_INET6,
181 port: in_port_t,
182 flowinfo: u32,
183 addr: in6_addr,
184 scope_id: u32,
185};
170pub const sockaddr = ws2_32.sockaddr;
171pub const sockaddr_in = ws2_32.sockaddr_in;
172pub const sockaddr_in6 = ws2_32.sockaddr_in6;
173pub const sockaddr_un = ws2_32.sockaddr_un;
174
186175pub const in6_addr = [16]u8;
187176pub const in_addr = u32;
188177
189pub const sockaddr_un = extern struct {
190 family: sa_family_t = AF_UNIX,
191 path: [108]u8,
192};
193
194pub const AF_UNSPEC = 0;
195pub const AF_UNIX = 1;
196pub const AF_INET = 2;
197pub const AF_IMPLINK = 3;
198pub const AF_PUP = 4;
199pub const AF_CHAOS = 5;
200pub const AF_NS = 6;
201pub const AF_IPX = AF_NS;
202pub const AF_ISO = 7;
203pub const AF_OSI = AF_ISO;
204pub const AF_ECMA = 8;
205pub const AF_DATAKIT = 9;
206pub const AF_CCITT = 10;
207pub const AF_SNA = 11;
208pub const AF_DECnet = 12;
209pub const AF_DLI = 13;
210pub const AF_LAT = 14;
211pub const AF_HYLINK = 15;
212pub const AF_APPLETALK = 16;
213pub const AF_NETBIOS = 17;
214pub const AF_VOICEVIEW = 18;
215pub const AF_FIREFOX = 19;
216pub const AF_UNKNOWN1 = 20;
217pub const AF_BAN = 21;
218pub const AF_ATM = 22;
219pub const AF_INET6 = 23;
220pub const AF_CLUSTER = 24;
221pub const AF_12844 = 25;
222pub const AF_IRDA = 26;
223pub const AF_NETDES = 28;
224pub const AF_TCNPROCESS = 29;
225pub const AF_TCNMESSAGE = 30;
226pub const AF_ICLFXBM = 31;
227pub const AF_BTH = 32;
228pub const AF_MAX = 33;
229
230pub const SOCK_STREAM = 1;
231pub const SOCK_DGRAM = 2;
232pub const SOCK_RAW = 3;
233pub const SOCK_RDM = 4;
234pub const SOCK_SEQPACKET = 5;
235
236pub const IPPROTO_ICMP = 1;
237pub const IPPROTO_IGMP = 2;
238pub const BTHPROTO_RFCOMM = 3;
239pub const IPPROTO_TCP = 6;
240pub const IPPROTO_UDP = 17;
241pub const IPPROTO_ICMPV6 = 58;
242pub const IPPROTO_RM = 113;
178pub const AF_UNSPEC = ws2_32.AF_UNSPEC;
179pub const AF_UNIX = ws2_32.AF_UNIX;
180pub const AF_INET = ws2_32.AF_INET;
181pub const AF_IMPLINK = ws2_32.AF_IMPLINK;
182pub const AF_PUP = ws2_32.AF_PUP;
183pub const AF_CHAOS = ws2_32.AF_CHAOS;
184pub const AF_NS = ws2_32.AF_NS;
185pub const AF_IPX = ws2_32.AF_IPX;
186pub const AF_ISO = ws2_32.AF_ISO;
187pub const AF_OSI = ws2_32.AF_OSI;
188pub const AF_ECMA = ws2_32.AF_ECMA;
189pub const AF_DATAKIT = ws2_32.AF_DATAKIT;
190pub const AF_CCITT = ws2_32.AF_CCITT;
191pub const AF_SNA = ws2_32.AF_SNA;
192pub const AF_DECnet = ws2_32.AF_DECnet;
193pub const AF_DLI = ws2_32.AF_DLI;
194pub const AF_LAT = ws2_32.AF_LAT;
195pub const AF_HYLINK = ws2_32.AF_HYLINK;
196pub const AF_APPLETALK = ws2_32.AF_APPLETALK;
197pub const AF_NETBIOS = ws2_32.AF_NETBIOS;
198pub const AF_VOICEVIEW = ws2_32.AF_VOICEVIEW;
199pub const AF_FIREFOX = ws2_32.AF_FIREFOX;
200pub const AF_UNKNOWN1 = ws2_32.AF_UNKNOWN1;
201pub const AF_BAN = ws2_32.AF_BAN;
202pub const AF_ATM = ws2_32.AF_ATM;
203pub const AF_INET6 = ws2_32.AF_INET6;
204pub const AF_CLUSTER = ws2_32.AF_CLUSTER;
205pub const AF_12844 = ws2_32.AF_12844;
206pub const AF_IRDA = ws2_32.AF_IRDA;
207pub const AF_NETDES = ws2_32.AF_NETDES;
208pub const AF_TCNPROCESS = ws2_32.AF_TCNPROCESS;
209pub const AF_TCNMESSAGE = ws2_32.AF_TCNMESSAGE;
210pub const AF_ICLFXBM = ws2_32.AF_ICLFXBM;
211pub const AF_BTH = ws2_32.AF_BTH;
212pub const AF_MAX = ws2_32.AF_MAX;
213
214pub const SOCK_STREAM = ws2_32.SOCK_STREAM;
215pub const SOCK_DGRAM = ws2_32.SOCK_DGRAM;
216pub const SOCK_RAW = ws2_32.SOCK_RAW;
217pub const SOCK_RDM = ws2_32.SOCK_RDM;
218pub const SOCK_SEQPACKET = ws2_32.SOCK_SEQPACKET;
219
220pub const IPPROTO_ICMP = ws2_32.IPPROTO_ICMP;
221pub const IPPROTO_IGMP = ws2_32.IPPROTO_IGMP;
222pub const BTHPROTO_RFCOMM = ws2_32.BTHPROTO_RFCOMM;
223pub const IPPROTO_TCP = ws2_32.IPPROTO_TCP;
224pub const IPPROTO_UDP = ws2_32.IPPROTO_UDP;
225pub const IPPROTO_ICMPV6 = ws2_32.IPPROTO_ICMPV6;
226pub const IPPROTO_RM = ws2_32.IPPROTO_RM;
lib/std/os/windows.zig+60-5
......@@ -97,6 +97,22 @@ pub fn CreatePipe(rd: *HANDLE, wr: *HANDLE, sattr: *const SECURITY_ATTRIBUTES) C
9797 }
9898}
9999
100pub fn CreateEventEx(attributes: ?*SECURITY_ATTRIBUTES, name: []const u8, flags: DWORD, desired_access: DWORD) !HANDLE {
101 const nameW = try sliceToPrefixedFileW(name);
102 return CreateEventExW(attributes, &nameW, flags, desired_access);
103}
104
105pub fn CreateEventExW(attributes: ?*SECURITY_ATTRIBUTES, nameW: [*:0]const u16, flags: DWORD, desired_access: DWORD) !HANDLE {
106 const handle = kernel32.CreateEventExW(attributes, nameW, flags, desired_access);
107 if (handle) |h| {
108 return h;
109 } else {
110 switch (kernel32.GetLastError()) {
111 else => |err| return unexpectedError(err),
112 }
113 }
114}
115
100116pub fn DeviceIoControl(
101117 h: HANDLE,
102118 ioControlCode: DWORD,
......@@ -116,6 +132,7 @@ pub fn DeviceIoControl(
116132 overlapped,
117133 ) == 0) {
118134 switch (kernel32.GetLastError()) {
135 ERROR.IO_PENDING => if (overlapped == null) unreachable,
119136 else => |err| return unexpectedError(err),
120137 }
121138 }
......@@ -124,9 +141,9 @@ pub fn DeviceIoControl(
124141
125142pub fn GetOverlappedResult(h: HANDLE, overlapped: *OVERLAPPED, wait: bool) !DWORD {
126143 var bytes: DWORD = undefined;
127 if (kernel32.GetOverlappedResult(h, overlapped, &bytes, wait) == 0) {
144 if (kernel32.GetOverlappedResult(h, overlapped, &bytes, @boolToInt(wait)) == 0) {
128145 switch (kernel32.GetLastError()) {
129 ERROR_IO_INCOMPLETE => if (!wait) return error.WouldBlock else unreachable,
146 ERROR.IO_INCOMPLETE => if (!wait) return error.WouldBlock else unreachable,
130147 else => |err| return unexpectedError(err),
131148 }
132149 }
......@@ -171,8 +188,8 @@ pub const WaitForSingleObjectError = error{
171188 Unexpected,
172189};
173190
174pub fn WaitForSingleObject(handle: HANDLE, milliseconds: DWORD) WaitForSingleObjectError!void {
175 switch (kernel32.WaitForSingleObject(handle, milliseconds)) {
191pub fn WaitForSingleObjectEx(handle: HANDLE, milliseconds: DWORD, alertable: bool) WaitForSingleObjectError!void {
192 switch (kernel32.WaitForSingleObjectEx(handle, milliseconds, @boolToInt(alertable))) {
176193 WAIT_ABANDONED => return error.WaitAbandoned,
177194 WAIT_OBJECT_0 => return,
178195 WAIT_TIMEOUT => return error.WaitTimeOut,
......@@ -183,6 +200,34 @@ pub fn WaitForSingleObject(handle: HANDLE, milliseconds: DWORD) WaitForSingleObj
183200 }
184201}
185202
203pub fn WaitForMultipleObjectsEx(handles: []const HANDLE, waitAll: bool, milliseconds: DWORD, alertable: bool) !u32 {
204 assert(handles.len < MAXIMUM_WAIT_OBJECTS);
205 const nCount: DWORD = @intCast(DWORD, handles.len);
206 switch (kernel32.WaitForMultipleObjectsEx(
207 nCount,
208 handles.ptr,
209 @boolToInt(waitAll),
210 milliseconds,
211 @boolToInt(alertable),
212 )) {
213 WAIT_OBJECT_0...WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS => |n| {
214 const handle_index = n - WAIT_OBJECT_0;
215 assert(handle_index < nCount);
216 return handle_index;
217 },
218 WAIT_ABANDONED_0...WAIT_ABANDONED_0 + MAXIMUM_WAIT_OBJECTS => |n| {
219 const handle_index = n - WAIT_ABANDONED_0;
220 assert(handle_index < nCount);
221 return error.WaitAbandoned;
222 },
223 WAIT_TIMEOUT => return error.WaitTimeOut,
224 WAIT_FAILED => switch (kernel32.GetLastError()) {
225 else => |err| return unexpectedError(err),
226 },
227 else => return error.Unexpected,
228 }
229}
230
186231pub const FindFirstFileError = error{
187232 FileNotFound,
188233 InvalidUtf8,
......@@ -647,13 +692,23 @@ pub fn WSASocketW(
647692 return rc;
648693}
649694
695pub fn closesocket(s: ws2_32.SOCKET) !void {
696 switch (ws2_32.closesocket(s)) {
697 0 => {},
698 ws2_32.SOCKET_ERROR => switch (ws2_32.WSAGetLastError()) {
699 else => |err| return unexpectedWSAError(err),
700 },
701 else => unreachable,
702 }
703}
704
650705pub fn WSAIoctl(
651706 s: ws2_32.SOCKET,
652707 dwIoControlCode: DWORD,
653708 inBuffer: ?[]const u8,
654709 outBuffer: []u8,
655710 overlapped: ?*ws2_32.WSAOVERLAPPED,
656 completionRoutine: ?*ws2_32.WSAOVERLAPPED_COMPLETION_ROUTINE,
711 completionRoutine: ?ws2_32.WSAOVERLAPPED_COMPLETION_ROUTINE,
657712) !DWORD {
658713 var bytes: DWORD = undefined;
659714 switch (ws2_32.WSAIoctl(
lib/std/os/windows/bits.zig+17-2
......@@ -19,7 +19,6 @@ pub const STD_OUTPUT_HANDLE = maxInt(DWORD) - 11 + 1;
1919/// The standard error device. Initially, this is the active console screen buffer, CONOUT$.
2020pub const STD_ERROR_HANDLE = maxInt(DWORD) - 12 + 1;
2121
22pub const SHORT = c_short;
2322pub const BOOL = c_int;
2423pub const BOOLEAN = BYTE;
2524pub const BYTE = u8;
......@@ -54,6 +53,8 @@ pub const UNICODE = false;
5453pub const WCHAR = u16;
5554pub const WORD = u16;
5655pub const LARGE_INTEGER = i64;
56pub const USHORT = u16;
57pub const SHORT = i16;
5758pub const ULONG = u32;
5859pub const LONG = i32;
5960pub const ULONGLONG = u64;
......@@ -236,7 +237,11 @@ pub const FILE_NAME_INFORMATION = extern struct {
236237};
237238
238239pub const IO_STATUS_BLOCK = extern struct {
239 Status: usize,
240 // "DUMMYUNIONNAME" expands to "u"
241 u: extern union {
242 Status: NTSTATUS,
243 Pointer: ?*c_void,
244 },
240245 Information: ULONG_PTR,
241246};
242247
......@@ -489,6 +494,13 @@ pub const FILE_ATTRIBUTE_SYSTEM = 0x4;
489494pub const FILE_ATTRIBUTE_TEMPORARY = 0x100;
490495pub const FILE_ATTRIBUTE_VIRTUAL = 0x10000;
491496
497// flags for CreateEvent
498pub const CREATE_EVENT_INITIAL_SET = 0x00000002;
499pub const CREATE_EVENT_MANUAL_RESET = 0x00000001;
500
501pub const EVENT_ALL_ACCESS = 0x1F0003;
502pub const EVENT_MODIFY_STATE = 0x0002;
503
492504pub const PROCESS_INFORMATION = extern struct {
493505 hProcess: HANDLE,
494506 hThread: HANDLE,
......@@ -534,7 +546,10 @@ pub const STARTF_USESTDHANDLES = 0x00000100;
534546
535547pub const INFINITE = 4294967295;
536548
549pub const MAXIMUM_WAIT_OBJECTS = 64;
550
537551pub const WAIT_ABANDONED = 0x00000080;
552pub const WAIT_ABANDONED_0 = WAIT_ABANDONED + 0;
538553pub const WAIT_OBJECT_0 = 0x00000000;
539554pub const WAIT_TIMEOUT = 0x00000102;
540555pub const WAIT_FAILED = 0xFFFFFFFF;
lib/std/os/windows/kernel32.zig+20-1
......@@ -9,6 +9,13 @@ pub extern "kernel32" stdcallcc fn CloseHandle(hObject: HANDLE) BOOL;
99
1010pub extern "kernel32" stdcallcc fn CreateDirectoryW(lpPathName: [*]const u16, lpSecurityAttributes: ?*SECURITY_ATTRIBUTES) BOOL;
1111
12pub extern "kernel32" stdcallcc fn CreateEventExW(
13 lpEventAttributes: ?*SECURITY_ATTRIBUTES,
14 lpName: [*:0]const u16,
15 dwFlags: DWORD,
16 dwDesiredAccess: DWORD,
17) ?HANDLE;
18
1219pub extern "kernel32" stdcallcc fn CreateFileW(
1320 lpFileName: [*]const u16, // TODO null terminated pointer type
1421 dwDesiredAccess: DWORD,
......@@ -52,7 +59,7 @@ pub extern "kernel32" stdcallcc fn DeviceIoControl(
5259 nInBufferSize: DWORD,
5360 lpOutBuffer: ?LPVOID,
5461 nOutBufferSize: DWORD,
55 lpBytesReturned: LPDWORD,
62 lpBytesReturned: ?*DWORD,
5663 lpOverlapped: ?*OVERLAPPED,
5764) BOOL;
5865
......@@ -205,6 +212,18 @@ pub extern "kernel32" stdcallcc fn TlsFree(dwTlsIndex: DWORD) BOOL;
205212
206213pub extern "kernel32" stdcallcc fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) DWORD;
207214
215pub extern "kernel32" stdcallcc fn WaitForSingleObjectEx(hHandle: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL) DWORD;
216
217pub extern "kernel32" stdcallcc fn WaitForMultipleObjects(nCount: DWORD, lpHandle: [*]const HANDLE, bWaitAll:BOOL, dwMilliseconds: DWORD) DWORD;
218
219pub extern "kernel32" stdcallcc fn WaitForMultipleObjectsEx(
220 nCount: DWORD,
221 lpHandle: [*]const HANDLE,
222 bWaitAll:BOOL,
223 dwMilliseconds: DWORD,
224 bAlertable: BOOL,
225) DWORD;
226
208227pub extern "kernel32" stdcallcc fn WriteFile(
209228 in_hFile: HANDLE,
210229 in_lpBuffer: [*]const u8,
lib/std/os/windows/ntdll.zig+2-2
......@@ -24,8 +24,8 @@ pub extern "NtDll" stdcallcc fn NtCreateFile(
2424pub extern "NtDll" stdcallcc fn NtDeviceIoControlFile(
2525 FileHandle: HANDLE,
2626 Event: ?HANDLE,
27 ApcRoutine: ?*IO_APC_ROUTINE,
28 ApcContext: usize,
27 ApcRoutine: ?IO_APC_ROUTINE,
28 ApcContext: ?*c_void,
2929 IoStatusBlock: *IO_STATUS_BLOCK,
3030 IoControlCode: ULONG,
3131 InputBuffer: ?*const c_void,
lib/std/os/windows/status.zig+7
......@@ -11,8 +11,13 @@ pub const ABANDONED_WAIT_0 = 0x00000080;
1111pub const ABANDONED_WAIT_63 = 0x000000BF;
1212pub const USER_APC = 0x000000C0;
1313pub const ALERTED = 0x00000101;
14
15/// The given Timeout interval expired.
1416pub const TIMEOUT = 0x00000102;
17
18/// The operation that was requested is pending completion.
1519pub const PENDING = 0x00000103;
20
1621pub const REPARSE = 0x00000104;
1722pub const MORE_ENTRIES = 0x00000105;
1823pub const NOT_ALL_ASSIGNED = 0x00000106;
......@@ -128,6 +133,8 @@ pub const GUARD_PAGE_VIOLATION = 0x80000001;
128133pub const DATATYPE_MISALIGNMENT = 0x80000002;
129134pub const BREAKPOINT = 0x80000003;
130135pub const SINGLE_STEP = 0x80000004;
136
137/// The data was too large to fit into the specified buffer.
131138pub const BUFFER_OVERFLOW = 0x80000005;
132139pub const NO_MORE_FILES = 0x80000006;
133140pub const WAKE_SYSTEM_DEBUGGER = 0x80000007;
lib/std/os/windows/ws2_32.zig+149-1
......@@ -108,6 +108,103 @@ pub const WSAOVERLAPPED = extern struct {
108108
109109pub const WSAOVERLAPPED_COMPLETION_ROUTINE = extern fn (dwError: DWORD, cbTransferred: DWORD, lpOverlapped: *WSAOVERLAPPED, dwFlags: DWORD) void;
110110
111pub const ADDRESS_FAMILY = u16;
112
113// Microsoft use the signed c_int for this, but it should never be negative
114const socklen_t = u32;
115
116pub const AF_UNSPEC = 0;
117pub const AF_UNIX = 1;
118pub const AF_INET = 2;
119pub const AF_IMPLINK = 3;
120pub const AF_PUP = 4;
121pub const AF_CHAOS = 5;
122pub const AF_NS = 6;
123pub const AF_IPX = AF_NS;
124pub const AF_ISO = 7;
125pub const AF_OSI = AF_ISO;
126pub const AF_ECMA = 8;
127pub const AF_DATAKIT = 9;
128pub const AF_CCITT = 10;
129pub const AF_SNA = 11;
130pub const AF_DECnet = 12;
131pub const AF_DLI = 13;
132pub const AF_LAT = 14;
133pub const AF_HYLINK = 15;
134pub const AF_APPLETALK = 16;
135pub const AF_NETBIOS = 17;
136pub const AF_VOICEVIEW = 18;
137pub const AF_FIREFOX = 19;
138pub const AF_UNKNOWN1 = 20;
139pub const AF_BAN = 21;
140pub const AF_ATM = 22;
141pub const AF_INET6 = 23;
142pub const AF_CLUSTER = 24;
143pub const AF_12844 = 25;
144pub const AF_IRDA = 26;
145pub const AF_NETDES = 28;
146pub const AF_TCNPROCESS = 29;
147pub const AF_TCNMESSAGE = 30;
148pub const AF_ICLFXBM = 31;
149pub const AF_BTH = 32;
150pub const AF_MAX = 33;
151
152pub const SOCK_STREAM = 1;
153pub const SOCK_DGRAM = 2;
154pub const SOCK_RAW = 3;
155pub const SOCK_RDM = 4;
156pub const SOCK_SEQPACKET = 5;
157
158pub const IPPROTO_ICMP = 1;
159pub const IPPROTO_IGMP = 2;
160pub const BTHPROTO_RFCOMM = 3;
161pub const IPPROTO_TCP = 6;
162pub const IPPROTO_UDP = 17;
163pub const IPPROTO_ICMPV6 = 58;
164pub const IPPROTO_RM = 113;
165
166pub const sockaddr = extern struct {
167 family: ADDRESS_FAMILY,
168 data: [14]u8,
169};
170
171/// IPv4 socket address
172pub const sockaddr_in = extern struct {
173 family: ADDRESS_FAMILY = AF_INET,
174 port: USHORT,
175 addr: u32,
176 zero: [8]u8 = [8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
177};
178
179/// IPv6 socket address
180pub const sockaddr_in6 = extern struct {
181 family: ADDRESS_FAMILY = AF_INET6,
182 port: USHORT,
183 flowinfo: u32,
184 addr: [16]u8,
185 scope_id: u32,
186};
187
188/// UNIX domain socket address
189pub const sockaddr_un = extern struct {
190 family: ADDRESS_FAMILY = AF_UNIX,
191 path: [108]u8,
192};
193
194pub const WSABUF = extern struct {
195 len: ULONG,
196 buf: [*]u8,
197};
198
199pub const WSAMSG = extern struct {
200 name: *const sockaddr,
201 namelen: INT,
202 lpBuffers: [*]WSABUF,
203 dwBufferCount: DWORD,
204 Control: WSABUF,
205 dwFlags: DWORD,
206};
207
111208pub const WSA_INVALID_HANDLE = 6;
112209pub const WSA_NOT_ENOUGH_MEMORY = 8;
113210pub const WSA_INVALID_PARAMETER = 87;
......@@ -240,6 +337,7 @@ pub extern "ws2_32" stdcallcc fn WSASocketW(
240337 g: GROUP,
241338 dwFlags: DWORD,
242339) SOCKET;
340pub extern "ws2_32" stdcallcc fn closesocket(s: SOCKET) c_int;
243341pub extern "ws2_32" stdcallcc fn WSAIoctl(
244342 s: SOCKET,
245343 dwIoControlCode: DWORD,
......@@ -249,5 +347,55 @@ pub extern "ws2_32" stdcallcc fn WSAIoctl(
249347 cbOutBuffer: DWORD,
250348 lpcbBytesReturned: LPDWORD,
251349 lpOverlapped: ?*WSAOVERLAPPED,
252 lpCompletionRoutine: ?*WSAOVERLAPPED_COMPLETION_ROUTINE,
350 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
351) c_int;
352pub extern "ws2_32" stdcallcc fn accept(
353 s: SOCKET,
354 addr: ?*sockaddr,
355 addrlen: socklen_t,
356) SOCKET;
357pub extern "ws2_32" stdcallcc fn connect(
358 s: SOCKET,
359 name: *const sockaddr,
360 namelen: socklen_t,
361) c_int;
362pub extern "ws2_32" stdcallcc fn WSARecv(
363 s: SOCKET,
364 lpBuffers: [*]const WSABUF,
365 dwBufferCount: DWORD,
366 lpNumberOfBytesRecvd: ?*DWORD,
367 lpFlags: *DWORD,
368 lpOverlapped: ?*WSAOVERLAPPED,
369 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
370) c_int;
371pub extern "ws2_32" stdcallcc fn WSARecvFrom(
372 s: SOCKET,
373 lpBuffers: [*]const WSABUF,
374 dwBufferCount: DWORD,
375 lpNumberOfBytesRecvd: ?*DWORD,
376 lpFlags: *DWORD,
377 lpFrom: ?*sockaddr,
378 lpFromlen: socklen_t,
379 lpOverlapped: ?*WSAOVERLAPPED,
380 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
381) c_int;
382pub extern "ws2_32" stdcallcc fn WSASend(
383 s: SOCKET,
384 lpBuffers: [*]WSABUF,
385 dwBufferCount: DWORD,
386 lpNumberOfBytesSent: ?*DWORD,
387 dwFlags: DWORD,
388 lpOverlapped: ?*WSAOVERLAPPED,
389 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
390) c_int;
391pub extern "ws2_32" stdcallcc fn WSASendTo(
392 s: SOCKET,
393 lpBuffers: [*]WSABUF,
394 dwBufferCount: DWORD,
395 lpNumberOfBytesSent: ?*DWORD,
396 dwFlags: DWORD,
397 lpTo: ?*const sockaddr,
398 iTolen: socklen_t,
399 lpOverlapped: ?*WSAOVERLAPPED,
400 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
253401) c_int;
lib/std/thread.zig+1-1
......@@ -99,7 +99,7 @@ pub const Thread = struct {
9999 os.munmap(self.data.memory);
100100 },
101101 .windows => {
102 windows.WaitForSingleObject(self.data.handle, windows.INFINITE) catch unreachable;
102 windows.WaitForSingleObjectEx(self.data.handle, windows.INFINITE, false) catch unreachable;
103103 windows.CloseHandle(self.data.handle);
104104 windows.HeapFree(self.data.heap_handle, 0, self.data.alloc_start);
105105 },