5
5
use crate :: fs;
6
6
use crate :: io;
7
7
use crate :: net;
8
+ #[ cfg( doc) ]
9
+ use crate :: os:: windows:: io:: { AsHandle , AsSocket } ;
8
10
use crate :: os:: windows:: io:: { OwnedHandle , OwnedSocket } ;
9
11
use crate :: os:: windows:: raw;
10
12
use crate :: sys;
@@ -22,7 +24,15 @@ pub type RawSocket = raw::SOCKET;
22
24
/// Extracts raw handles.
23
25
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
24
26
pub 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.
26
36
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
27
37
fn as_raw_handle ( & self ) -> RawHandle ;
28
38
}
@@ -32,15 +42,30 @@ pub trait AsRawHandle {
32
42
pub trait FromRawHandle {
33
43
/// Constructs a new I/O object from the specified raw handle.
34
44
///
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
38
56
///
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
44
69
#[ stable( feature = "from_raw_os" , since = "1.1.0" ) ]
45
70
unsafe fn from_raw_handle ( handle : RawHandle ) -> Self ;
46
71
}
@@ -51,9 +76,13 @@ pub trait FromRawHandle {
51
76
pub trait IntoRawHandle {
52
77
/// Consumes this object, returning the raw underlying handle.
53
78
///
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.
57
86
#[ stable( feature = "into_raw_os" , since = "1.4.0" ) ]
58
87
fn into_raw_handle ( self ) -> RawHandle ;
59
88
}
@@ -130,24 +159,41 @@ impl IntoRawHandle for fs::File {
130
159
/// Extracts raw sockets.
131
160
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
132
161
pub 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.
134
171
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
135
172
fn as_raw_socket ( & self ) -> RawSocket ;
136
173
}
137
174
138
175
/// Creates I/O objects from raw sockets.
139
176
#[ stable( feature = "from_raw_os" , since = "1.1.0" ) ]
140
177
pub 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.
142
185
///
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.
145
189
///
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
151
197
#[ stable( feature = "from_raw_os" , since = "1.1.0" ) ]
152
198
unsafe fn from_raw_socket ( sock : RawSocket ) -> Self ;
153
199
}
@@ -158,9 +204,13 @@ pub trait FromRawSocket {
158
204
pub trait IntoRawSocket {
159
205
/// Consumes this object, returning the raw underlying socket.
160
206
///
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.
164
214
#[ stable( feature = "into_raw_os" , since = "1.4.0" ) ]
165
215
fn into_raw_socket ( self ) -> RawSocket ;
166
216
}
0 commit comments