@@ -8,9 +8,8 @@ use crate::net::{Shutdown, SocketAddr};
88use crate :: os:: windows:: io:: {
99 AsRawSocket , AsSocket , BorrowedSocket , FromRawSocket , IntoRawSocket , OwnedSocket , RawSocket ,
1010} ;
11- use crate :: sync:: atomic:: Atomic ;
12- use crate :: sync:: atomic:: Ordering :: { AcqRel , Relaxed } ;
1311use crate :: sys:: c;
12+ use crate :: sys:: pal:: winsock:: last_error;
1413use crate :: sys_common:: { AsInner , FromInner , IntoInner } ;
1514use crate :: time:: Duration ;
1615use crate :: { cmp, mem, ptr, sys} ;
@@ -112,84 +111,11 @@ pub(super) mod netc {
112111 }
113112}
114113
114+ pub use crate :: sys:: pal:: winsock:: { cleanup, cvt, cvt_gai, cvt_r, startup as init} ;
115+
115116#[ expect( missing_debug_implementations) ]
116117pub struct Socket ( OwnedSocket ) ;
117118
118- static WSA_INITIALIZED : Atomic < bool > = Atomic :: < bool > :: new ( false ) ;
119-
120- /// Checks whether the Windows socket interface has been started already, and
121- /// if not, starts it.
122- #[ inline]
123- pub fn init ( ) {
124- if !WSA_INITIALIZED . load ( Relaxed ) {
125- wsa_startup ( ) ;
126- }
127- }
128-
129- #[ cold]
130- fn wsa_startup ( ) {
131- unsafe {
132- let mut data: c:: WSADATA = mem:: zeroed ( ) ;
133- let ret = c:: WSAStartup (
134- 0x202 , // version 2.2
135- & mut data,
136- ) ;
137- assert_eq ! ( ret, 0 ) ;
138- if WSA_INITIALIZED . swap ( true , AcqRel ) {
139- // If another thread raced with us and called WSAStartup first then call
140- // WSACleanup so it's as though WSAStartup was only called once.
141- c:: WSACleanup ( ) ;
142- }
143- }
144- }
145-
146- pub fn cleanup ( ) {
147- // We don't need to call WSACleanup here because exiting the process will cause
148- // the OS to clean everything for us, which is faster than doing it manually.
149- // See #141799.
150- }
151-
152- /// Returns the last error from the Windows socket interface.
153- fn last_error ( ) -> io:: Error {
154- io:: Error :: from_raw_os_error ( unsafe { c:: WSAGetLastError ( ) } )
155- }
156-
157- #[ doc( hidden) ]
158- pub trait IsMinusOne {
159- fn is_minus_one ( & self ) -> bool ;
160- }
161-
162- macro_rules! impl_is_minus_one {
163- ( $( $t: ident) * ) => ( $( impl IsMinusOne for $t {
164- fn is_minus_one( & self ) -> bool {
165- * self == -1
166- }
167- } ) * )
168- }
169-
170- impl_is_minus_one ! { i8 i16 i32 i64 isize }
171-
172- /// Checks if the signed integer is the Windows constant `SOCKET_ERROR` (-1)
173- /// and if so, returns the last error from the Windows socket interface. This
174- /// function must be called before another call to the socket API is made.
175- pub fn cvt < T : IsMinusOne > ( t : T ) -> io:: Result < T > {
176- if t. is_minus_one ( ) { Err ( last_error ( ) ) } else { Ok ( t) }
177- }
178-
179- /// A variant of `cvt` for `getaddrinfo` which return 0 for a success.
180- pub fn cvt_gai ( err : c_int ) -> io:: Result < ( ) > {
181- if err == 0 { Ok ( ( ) ) } else { Err ( last_error ( ) ) }
182- }
183-
184- /// Just to provide the same interface as sys/pal/unix/net.rs
185- pub fn cvt_r < T , F > ( mut f : F ) -> io:: Result < T >
186- where
187- T : IsMinusOne ,
188- F : FnMut ( ) -> T ,
189- {
190- cvt ( f ( ) )
191- }
192-
193119impl Socket {
194120 pub fn new ( addr : & SocketAddr , ty : c_int ) -> io:: Result < Socket > {
195121 let family = match * addr {
0 commit comments