mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-09-25 12:00:35 +00:00

This refactors I/O registration in a few ways: - Cleans up the cached readiness in `PollEvented`. This cache used to be helpful when readiness was a linked list of `*mut Node`s in `Registration`. Previous refactors have turned `Registration` into just an `AtomicUsize` holding the current readiness, so the cache is just extra work and complexity. Gone. - Polling the `Registration` for readiness now gives a `ReadyEvent`, which includes the driver tick. This event must be passed back into `clear_readiness`, so that the readiness is only cleared from `Registration` if the tick hasn't changed. Previously, it was possible to clear the readiness even though another thread had *just* polled the driver and found the socket ready again. - Registration now also contains an `async fn readiness`, which stores wakers in an instrusive linked list. This allows an unbounded number of tasks to register for readiness (previously, only 1 per direction (read and write)). By using the intrusive linked list, there is no concern of leaking the storage of the wakers, since they are stored inside the `async fn` and released when the future is dropped. - Registration retains a `poll_readiness(Direction)` method, to support `AsyncRead` and `AsyncWrite`. They aren't able to use `async fn`s, and so there are 2 reserved slots for those methods. - IO types where it makes sense to have multiple tasks waiting on them now take advantage of this new `async fn readiness`, such as `UdpSocket` and `UnixDatagram`. Additionally, this makes the `io-driver` "feature" internal-only (no longer documented, not part of public API), and adds a second internal-only feature, `io-readiness`, to group together linked list part of registration that is only used by some of the IO types. After a bit of discussion, changing stream-based transports (like `TcpStream`) to have `async fn read(&self)` is punted, since that is likely too easy of a footgun to activate. Refs: #2779, #2728
54 lines
1.2 KiB
TOML
54 lines
1.2 KiB
TOML
[package]
|
|
name = "tokio-util"
|
|
# When releasing to crates.io:
|
|
# - Remove path dependencies
|
|
# - Update html_root_url.
|
|
# - Update doc url
|
|
# - Cargo.toml
|
|
# - Update CHANGELOG.md.
|
|
# - Create "v0.2.x" git tag.
|
|
version = "0.4.0"
|
|
edition = "2018"
|
|
authors = ["Tokio Contributors <team@tokio.rs>"]
|
|
license = "MIT"
|
|
repository = "https://github.com/tokio-rs/tokio"
|
|
homepage = "https://tokio.rs"
|
|
documentation = "https://docs.rs/tokio-util/0.4.0/tokio_util"
|
|
description = """
|
|
Additional utilities for working with Tokio.
|
|
"""
|
|
categories = ["asynchronous"]
|
|
publish = false
|
|
|
|
[features]
|
|
# No features on by default
|
|
default = []
|
|
|
|
# Shorthand for enabling everything
|
|
full = ["codec", "compat", "io"]
|
|
|
|
compat = ["futures-io",]
|
|
codec = ["tokio/stream"]
|
|
io = []
|
|
|
|
[dependencies]
|
|
tokio = { version = "0.3.0", path = "../tokio" }
|
|
|
|
bytes = "0.5.0"
|
|
futures-core = "0.3.0"
|
|
futures-sink = "0.3.0"
|
|
futures-io = { version = "0.3.0", optional = true }
|
|
log = "0.4"
|
|
pin-project-lite = "0.1.4"
|
|
|
|
[dev-dependencies]
|
|
tokio = { version = "0.3.0", path = "../tokio", features = ["full"] }
|
|
tokio-test = { version = "0.3.0", path = "../tokio-test" }
|
|
|
|
futures = "0.3.0"
|
|
futures-test = "0.3.5"
|
|
|
|
[package.metadata.docs.rs]
|
|
all-features = true
|
|
rustdoc-args = ["--cfg", "docsrs"]
|