55use crate :: fs;
66use crate :: io;
77use crate :: net;
8+ #[ cfg( doc) ]
9+ use crate :: os:: windows:: io:: { AsHandle , AsSocket } ;
810use crate :: os:: windows:: io:: { OwnedHandle , OwnedSocket } ;
911use crate :: os:: windows:: raw;
1012use crate :: sys;
@@ -22,7 +24,15 @@ pub type RawSocket = raw::SOCKET;
2224/// Extracts raw handles.
2325#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2426pub trait AsRawHandle {
25- /// Extracts the raw handle, without taking any ownership.
27+ /// Extracts the raw handle.
28+ ///
29+ /// This function is typically used to **borrow** an owned handle.
30+ /// When used in this way, this method does **not** pass ownership of the
31+ /// raw handle to the caller, and the handle is only guaranteed
32+ /// to be valid while the original object has not yet been destroyed.
33+ ///
34+ /// However, borrowing is not strictly required. See [`AsHandle::as_handle`]
35+ /// for an API which strictly borrows a handle.
2636 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
2737 fn as_raw_handle ( & self ) -> RawHandle ;
2838}
@@ -32,15 +42,30 @@ pub trait AsRawHandle {
3242pub trait FromRawHandle {
3343 /// Constructs a new I/O object from the specified raw handle.
3444 ///
35- /// This function will **consume ownership** of the handle given,
36- /// passing responsibility for closing the handle to the returned
37- /// object.
45+ /// This function is typically used to **consume ownership** of the handle
46+ /// given, passing responsibility for closing the handle to the returned
47+ /// object. When used in this way, the returned object
48+ /// will take responsibility for closing it when the object goes out of
49+ /// scope.
50+ ///
51+ /// However, consuming ownership is not strictly required. Use a
52+ /// `From<OwnedHandle>::from` implementation for an API which strictly
53+ /// consumes ownership.
54+ ///
55+ /// # Safety
3856 ///
39- /// This function is also unsafe as the primitives currently returned
40- /// have the contract that they are the sole owner of the file
41- /// descriptor they are wrapping. Usage of this function could
42- /// accidentally allow violating this contract which can cause memory
43- /// unsafety in code that relies on it being true.
57+ /// The `handle` passed in must:
58+ /// - be a valid an open handle,
59+ /// - be a handle opened for synchronous I/O, *without* the
60+ /// `FILE_FLAG_OVERLAPPED` flag, and
61+ /// - be a handle for a resource that may be freed via [`CloseHandle`]
62+ /// (as opposed to `RegCloseKey` or other close functions).
63+ ///
64+ /// Note that the handle *may* have the value `INVALID_HANDLE_VALUE` (-1),
65+ /// which is sometimes a valid handle value. See [here] for the full story.
66+ ///
67+ /// [`CloseHandle`]: https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle
68+ /// [here]: https://devblogs.microsoft.com/oldnewthing/20040302-00/?p=40443
4469 #[ stable( feature = "from_raw_os" , since = "1.1.0" ) ]
4570 unsafe fn from_raw_handle ( handle : RawHandle ) -> Self ;
4671}
@@ -51,9 +76,13 @@ pub trait FromRawHandle {
5176pub trait IntoRawHandle {
5277 /// Consumes this object, returning the raw underlying handle.
5378 ///
54- /// This function **transfers ownership** of the underlying handle to the
55- /// caller. Callers are then the unique owners of the handle and must close
56- /// it once it's no longer needed.
79+ /// This function is typically used to **transfer ownership** of the underlying
80+ /// handle to the caller. When used in this way, callers are then the unique
81+ /// owners of the handle and must close it once it's no longer needed.
82+ ///
83+ /// However, transferring ownership is not strictly required. Use a
84+ /// `Into<OwnedHandle>::into` implementation for an API which strictly
85+ /// transfers ownership.
5786 #[ stable( feature = "into_raw_os" , since = "1.4.0" ) ]
5887 fn into_raw_handle ( self ) -> RawHandle ;
5988}
@@ -130,24 +159,41 @@ impl IntoRawHandle for fs::File {
130159/// Extracts raw sockets.
131160#[ stable( feature = "rust1" , since = "1.0.0" ) ]
132161pub trait AsRawSocket {
133- /// Extracts the underlying raw socket from this object.
162+ /// Extracts the raw socket.
163+ ///
164+ /// This function is typically used to **borrow** an owned socket.
165+ /// When used in this way, this method does **not** pass ownership of the
166+ /// raw socket to the caller, and the socket is only guaranteed
167+ /// to be valid while the original object has not yet been destroyed.
168+ ///
169+ /// However, borrowing is not strictly required. See [`AsSocket::as_socket`]
170+ /// for an API which strictly borrows a socket.
134171 #[ stable( feature = "rust1" , since = "1.0.0" ) ]
135172 fn as_raw_socket ( & self ) -> RawSocket ;
136173}
137174
138175/// Creates I/O objects from raw sockets.
139176#[ stable( feature = "from_raw_os" , since = "1.1.0" ) ]
140177pub trait FromRawSocket {
141- /// Creates a new I/O object from the given raw socket.
178+ /// Constructs a new I/O object from the specified raw socket.
179+ ///
180+ /// This function is typically used to **consume ownership** of the socket
181+ /// given, passing responsibility for closing the socket to the returned
182+ /// object. When used in this way, the returned object
183+ /// will take responsibility for closing it when the object goes out of
184+ /// scope.
142185 ///
143- /// This function will **consume ownership** of the socket provided and
144- /// it will be closed when the returned object goes out of scope.
186+ /// However, consuming ownership is not strictly required. Use a
187+ /// `From<OwnedSocket>::from` implementation for an API which strictly
188+ /// consumes ownership.
145189 ///
146- /// This function is also unsafe as the primitives currently returned
147- /// have the contract that they are the sole owner of the file
148- /// descriptor they are wrapping. Usage of this function could
149- /// accidentally allow violating this contract which can cause memory
150- /// unsafety in code that relies on it being true.
190+ /// # Safety
191+ ///
192+ /// The `socket` passed in must:
193+ /// - be a valid an open socket,
194+ /// - be a socket that may be freed via [`closesocket`].
195+ ///
196+ /// [`closesocket`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-closesocket
151197 #[ stable( feature = "from_raw_os" , since = "1.1.0" ) ]
152198 unsafe fn from_raw_socket ( sock : RawSocket ) -> Self ;
153199}
@@ -158,9 +204,13 @@ pub trait FromRawSocket {
158204pub trait IntoRawSocket {
159205 /// Consumes this object, returning the raw underlying socket.
160206 ///
161- /// This function **transfers ownership** of the underlying socket to the
162- /// caller. Callers are then the unique owners of the socket and must close
163- /// it once it's no longer needed.
207+ /// This function is typically used to **transfer ownership** of the underlying
208+ /// socket to the caller. When used in this way, callers are then the unique
209+ /// owners of the socket and must close it once it's no longer needed.
210+ ///
211+ /// However, transferring ownership is not strictly required. Use a
212+ /// `Into<OwnedSocket>::into` implementation for an API which strictly
213+ /// transfers ownership.
164214 #[ stable( feature = "into_raw_os" , since = "1.4.0" ) ]
165215 fn into_raw_socket ( self ) -> RawSocket ;
166216}
0 commit comments