1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//! 特定于 Windows 的通用 I/O 原语扩展。
//!
//! 就像裸指针一样,原始的 Windows 句柄和套接字指向具有动态生命周期的资源,如果它们比它们的资源生命周期更长,它们可以悬垂,如果它们是由无效值创建的,则它们可以被伪造。
//!
//! 该模块提供了三种类型来表示具有不同所有权属性的原始句柄和套接字:原始、借用和拥有,类似于用于表示指针的类型:
//!
//! | Type                   | Analogous to |
//! | ---------------------- | ------------ |
//! | [`RawHandle`]          | `*const _`   |
//! | [`RawSocket`]          | `*const _`   |
//! |                        |              |
//! | [`BorrowedHandle<'a>`] | `&'a _`      |
//! | [`BorrowedSocket<'a>`] | `&'a _`      |
//! |                        |              |
//! | [`OwnedHandle`]        | `Box<_>`     |
//! | [`OwnedSocket`]        | `Box<_>`     |
//!
//! 和裸指针一样,`RawHandle` 和 `RawSocket` 值都是原始值。
//! 并且在新代码中,他们应该被认为是不安全的 (类似于解引用他们)。Rust 并不总是提供这种指导,因此 Rust 生态系统中的现有代码通常不会将 `RawHandle` 和 `RawSocket` 的使用标记为不安全。
//! 一旦 `io_safety` 特性稳定,将鼓励库迁移,通过将 `unsafe` 添加到解引用 `RawHandle` 和 `RawSocket` 值的 API,或通过使用 `BorrowedHandle`、`BorrowedSocket`、`OwnedHandle` 或 `OwnedSocket`。
//!
//! 与引用一样,`BorrowedHandle` 和 `BorrowedSocket` 值与生命周期相关联,以确保它们的生命周期不会超过它们指向的资源。
//! 这些可以安全使用。`BorrowedHandle` 和 `BorrowedSocket` 值可用于提供对任何系统调用的安全访问的 API,但 `CloseHandle`、`closesocket` 或将结束资源的动态生命周期而不结束句柄或套接字的生命周期的任何其他调用。
//!
//! `BorrowedHandle` 和 `BorrowedSocket` 值可用于提供对 `DuplicateHandle` 和 `WSADuplicateSocketW` 及相关函数的安全访问的 API,因此实现 `AsHandle`、`AsSocket`、`From<OwnedHandle>` 或 `From<OwnedSocket>` 的类型不应假定它们始终具有对底层 object 的独占访问权。
//!
//!
//! 与 boxes 一样,`OwnedHandle` 和 `OwnedSocket` 值在概念上拥有它们指向的资源,并在它们被丢弃时释放 (close)。
//!
//! [`BorrowedHandle<'a>`]: crate::os::windows::io::BorrowedHandle
//! [`BorrowedSocket<'a>`]: crate::os::windows::io::BorrowedSocket
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!

#![stable(feature = "rust1", since = "1.0.0")]

mod handle;
mod raw;
mod socket;

#[stable(feature = "io_safety", since = "1.63.0")]
pub use handle::*;
#[stable(feature = "rust1", since = "1.0.0")]
pub use raw::*;
#[stable(feature = "io_safety", since = "1.63.0")]
pub use socket::*;

#[cfg(test)]
mod tests;