mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-14 00:00:12 +02: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
245 lines
6.3 KiB
YAML
245 lines
6.3 KiB
YAML
on:
|
|
push:
|
|
branches: ["master"]
|
|
pull_request:
|
|
branches: ["master"]
|
|
|
|
name: CI
|
|
|
|
env:
|
|
RUSTFLAGS: -Dwarnings
|
|
RUST_BACKTRACE: 1
|
|
nightly: nightly-2020-09-21
|
|
minrust: 1.45.2
|
|
|
|
jobs:
|
|
# Depends on all action sthat are required for a "successful" CI run.
|
|
tests-pass:
|
|
name: all systems go
|
|
runs-on: ubuntu-latest
|
|
needs:
|
|
- test
|
|
- test-unstable
|
|
- miri
|
|
- cross
|
|
- features
|
|
- minrust
|
|
- fmt
|
|
- clippy
|
|
- docs
|
|
- loom
|
|
steps:
|
|
- run: exit 0
|
|
|
|
test:
|
|
name: test tokio full
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
matrix:
|
|
os:
|
|
- windows-latest
|
|
- ubuntu-latest
|
|
- macos-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Install Rust
|
|
run: rustup update stable
|
|
- name: Install cargo-hack
|
|
run: cargo install cargo-hack
|
|
|
|
# Run `tokio` with `full` features. This excludes testing utilities which
|
|
# can alter the runtime behavior of Tokio.
|
|
- name: test tokio full
|
|
run: cargo test --features full
|
|
working-directory: tokio
|
|
|
|
# Check `tokio` with `full + parking_lot` to make sure it compiles.
|
|
- name: check tokio full,parking_lot
|
|
run: cargo check --features full,parking_lot
|
|
working-directory: tokio
|
|
|
|
# Test **all** crates in the workspace with all features.
|
|
- name: test all --all-features
|
|
run: cargo test --workspace --all-features
|
|
|
|
# Run integration tests for each feature
|
|
- name: test tests-integration --each-feature
|
|
run: cargo hack test --each-feature
|
|
working-directory: tests-integration
|
|
|
|
# Run macro build tests
|
|
- name: test tests-build --each-feature
|
|
run: cargo hack test --each-feature
|
|
working-directory: tests-build
|
|
|
|
test-unstable:
|
|
name: test tokio full --unstable
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
matrix:
|
|
os:
|
|
- windows-latest
|
|
- ubuntu-latest
|
|
- macos-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Install Rust
|
|
run: rustup update stable
|
|
|
|
# Run `tokio` with "unstable" cfg flag.
|
|
- name: test tokio full --cfg unstable
|
|
run: cargo test --features full
|
|
working-directory: tokio
|
|
env:
|
|
RUSTFLAGS: --cfg tokio_unstable -Dwarnings
|
|
|
|
miri:
|
|
name: miri
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: actions-rs/toolchain@v1
|
|
with:
|
|
toolchain: ${{ env.nightly }}
|
|
override: true
|
|
- name: Install Miri
|
|
run: |
|
|
set -e
|
|
rustup component add miri
|
|
cargo miri setup
|
|
rm -rf tokio/tests
|
|
|
|
- name: miri
|
|
run: cargo miri test --features rt-core,rt-threaded,rt-util,sync task
|
|
working-directory: tokio
|
|
|
|
cross:
|
|
name: cross
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
target:
|
|
- i686-unknown-linux-gnu
|
|
- powerpc-unknown-linux-gnu
|
|
- powerpc64-unknown-linux-gnu
|
|
- mips-unknown-linux-gnu
|
|
- arm-linux-androideabi
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: actions-rs/toolchain@v1
|
|
with:
|
|
toolchain: stable
|
|
target: ${{ matrix.target }}
|
|
override: true
|
|
- uses: actions-rs/cargo@v1
|
|
with:
|
|
use-cross: true
|
|
command: check
|
|
args: --workspace --target ${{ matrix.target }}
|
|
|
|
features:
|
|
name: features
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: actions-rs/toolchain@v1
|
|
with:
|
|
toolchain: ${{ env.nightly }}
|
|
override: true
|
|
- name: Install cargo-hack
|
|
run: cargo install cargo-hack
|
|
|
|
- name: check --each-feature
|
|
run: cargo hack check --all --each-feature --skip io-driver,io-readiness -Z avoid-dev-deps
|
|
|
|
# Try with unstable feature flags
|
|
- name: check --each-feature --unstable
|
|
run: cargo hack check --all --each-feature --skip io-driver,io-readiness -Z avoid-dev-deps
|
|
env:
|
|
RUSTFLAGS: --cfg tokio_unstable -Dwarnings
|
|
|
|
minrust:
|
|
name: minrust
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: actions-rs/toolchain@v1
|
|
with:
|
|
toolchain: ${{ env.minrust }}
|
|
override: true
|
|
|
|
- name: "test --workspace --all-features"
|
|
run: cargo check --workspace --all-features
|
|
|
|
fmt:
|
|
name: fmt
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Install Rust
|
|
run: rustup update stable
|
|
- name: Install rustfmt
|
|
run: rustup component add rustfmt
|
|
|
|
# Check fmt
|
|
- name: "rustfmt --check"
|
|
# Workaround for rust-lang/cargo#7732
|
|
run: |
|
|
if ! rustfmt --check --edition 2018 $(find . -name '*.rs' -print); then
|
|
printf "Please run \`rustfmt --edition 2018 \$(find . -name '*.rs' -print)\` to fix rustfmt errors.\nSee CONTRIBUTING.md for more details.\n" >&2
|
|
exit 1
|
|
fi
|
|
|
|
clippy:
|
|
name: clippy
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Install Rust
|
|
run: rustup update stable
|
|
- name: Install clippy
|
|
run: rustup component add clippy
|
|
|
|
# Run clippy
|
|
- name: "clippy --all"
|
|
run: cargo clippy --all --tests
|
|
|
|
docs:
|
|
name: docs
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: actions-rs/toolchain@v1
|
|
with:
|
|
toolchain: ${{ env.nightly }}
|
|
override: true
|
|
|
|
- name: "doc --lib --all-features"
|
|
run: cargo doc --lib --no-deps --all-features
|
|
env:
|
|
RUSTDOCFLAGS: --cfg docsrs
|
|
|
|
loom:
|
|
name: loom
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
scope:
|
|
- --skip loom_pool
|
|
- loom_pool::group_a
|
|
- loom_pool::group_b
|
|
- loom_pool::group_c
|
|
- loom_pool::group_d
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Install Rust
|
|
run: rustup update stable
|
|
|
|
- name: loom ${{ matrix.scope }}
|
|
run: cargo test --lib --release --features full -- --nocapture $SCOPE
|
|
working-directory: tokio
|
|
env:
|
|
RUSTFLAGS: --cfg loom --cfg tokio_unstable -Dwarnings
|
|
LOOM_MAX_PREEMPTIONS: 2
|
|
SCOPE: ${{ matrix.scope }}
|