diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1bdfb7320..e0687becf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -222,7 +222,8 @@ jobs: uses: dtolnay/rust-toolchain@master with: toolchain: ${{ env.rust_nightly }} - - uses: Swatinem/rust-cache@v2 + override: true + # - uses: Swatinem/rust-cache@v1 -> CI failure observed due to insufficient storage space - name: asan run: cargo test --workspace --all-features --target x86_64-unknown-linux-gnu --tests -- --test-threads 1 env: @@ -330,9 +331,11 @@ jobs: target: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 - name: Install cargo-hack - uses: taiki-e/install-action@cargo-hack - - name: check --feature-powerset - run: cargo hack check --all --feature-powerset --depth 2 -Z avoid-dev-deps --keep-going + uses: taiki-e/install-action@v2 + with: + tool: cargo-hack + - name: check --each-feature + run: cargo hack check --all --each-feature -Z avoid-dev-deps # Try with unstable feature flags - name: check --feature-powerset --unstable run: cargo hack check --all --feature-powerset --depth 2 -Z avoid-dev-deps --keep-going @@ -365,7 +368,9 @@ jobs: toolchain: ${{ env.rust_nightly }} - uses: Swatinem/rust-cache@v2 - name: Install cargo-hack - uses: taiki-e/install-action@cargo-hack + uses: taiki-e/install-action@v2 + with: + tool: cargo-hack - name: "check --all-features -Z minimal-versions" run: | # Remove dev-dependencies from Cargo.toml to prevent the next `cargo update` @@ -475,10 +480,10 @@ jobs: - macos-latest steps: - uses: actions/checkout@v3 - - name: Install Rust ${{ env.rust_stable }} + - name: Install Rust 1.65.0 uses: dtolnay/rust-toolchain@master with: - toolchain: ${{ env.rust_stable }} + toolchain: 1.65.0 - uses: Swatinem/rust-cache@v2 - name: Test hyper run: | @@ -542,8 +547,9 @@ jobs: # Install dependencies - name: Install cargo-hack - uses: taiki-e/install-action@cargo-hack - + uses: taiki-e/install-action@v2 + with: + tool: cargo-hack - name: Install wasm32-wasi target run: rustup target add wasm32-wasi diff --git a/Cargo.lock b/Cargo.lock index ae78f634e..6b5cf44ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,6 +132,44 @@ dependencies = [ "pin-project-internal", ] +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "quote" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5907a1b7c277254a8b15170f6e7c97cfa60ee7872a3217663bb81151e48184bb" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "proc-macro2" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92de25114670a878b1261c79c9f8f729fb97e95bac93f6312f583c60dd6a1dfe" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +dependencies = [ + "autocfg", + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys", +] + [[package]] name = "predicates" version = "2.0.1" @@ -289,3 +327,12 @@ dependencies = [ "tokio-test", "tracing", ] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] diff --git a/tokio/CHANGELOG.md b/tokio/CHANGELOG.md index c6e69e1a6..2cac89ee4 100644 --- a/tokio/CHANGELOG.md +++ b/tokio/CHANGELOG.md @@ -344,6 +344,16 @@ wasm32-wasi target is given unstable support for the `net` feature. [#4956]: https://github.com/tokio-rs/tokio/pull/4956 [#4959]: https://github.com/tokio-rs/tokio/pull/4959 +# 1.20.6 (September 22, 2023) + +This is a backport of a change from 1.27.0. + +### Changed + +- io: use `memchr` from `libc` ([#5960]) + +[#5960]: https://github.com/tokio-rs/tokio/pull/5960 + # 1.20.5 (May 28, 2023) Forward ports 1.18.6 changes. diff --git a/tokio/Cargo.toml b/tokio/Cargo.toml index 99c780be3..38da82234 100644 --- a/tokio/Cargo.toml +++ b/tokio/Cargo.toml @@ -42,7 +42,7 @@ full = [ ] fs = [] -io-util = ["memchr", "bytes"] +io-util = ["bytes"] # stdin, stdout, stderr io-std = [] macros = ["tokio-macros"] @@ -103,7 +103,6 @@ pin-project-lite = "0.2.0" # Everything else is optional... bytes = { version = "1.0.0", optional = true } -memchr = { version = "2.2", optional = true } mio = { version = "0.8.4", optional = true, default-features = false } num_cpus = { version = "1.8.0", optional = true } parking_lot = { version = "0.12.0", optional = true } diff --git a/tokio/src/future/mod.rs b/tokio/src/future/mod.rs index 084ddc571..7c883eb3c 100644 --- a/tokio/src/future/mod.rs +++ b/tokio/src/future/mod.rs @@ -20,6 +20,7 @@ cfg_sync! { cfg_trace! { mod trace; + #[allow(unused_imports)] pub(crate) use trace::InstrumentedFuture as Future; } diff --git a/tokio/src/io/util/read_until.rs b/tokio/src/io/util/read_until.rs index 90a0e8a18..fb6fb22d9 100644 --- a/tokio/src/io/util/read_until.rs +++ b/tokio/src/io/util/read_until.rs @@ -1,4 +1,5 @@ use crate::io::AsyncBufRead; +use crate::util::memchr; use pin_project_lite::pin_project; use std::future::Future; diff --git a/tokio/src/util/memchr.rs b/tokio/src/util/memchr.rs new file mode 100644 index 000000000..44fd2da37 --- /dev/null +++ b/tokio/src/util/memchr.rs @@ -0,0 +1,74 @@ +//! Search for a byte in a byte array using libc. +//! +//! When nothing pulls in libc, then just use a trivial implementation. Note +//! that we only depend on libc on unix. + +#[cfg(not(all(unix, feature = "libc")))] +pub(crate) fn memchr(needle: u8, haystack: &[u8]) -> Option { + haystack.iter().position(|val| needle == *val) +} + +#[cfg(all(unix, feature = "libc"))] +pub(crate) fn memchr(needle: u8, haystack: &[u8]) -> Option { + let start = haystack.as_ptr(); + + // SAFETY: `start` is valid for `haystack.len()` bytes. + let ptr = unsafe { libc::memchr(start.cast(), needle as _, haystack.len()) }; + + if ptr.is_null() { + None + } else { + Some(ptr as usize - start as usize) + } +} + +#[cfg(test)] +mod tests { + use super::memchr; + + #[test] + fn memchr_test() { + let haystack = b"123abc456\0\xffabc\n"; + + assert_eq!(memchr(b'1', haystack), Some(0)); + assert_eq!(memchr(b'2', haystack), Some(1)); + assert_eq!(memchr(b'3', haystack), Some(2)); + assert_eq!(memchr(b'4', haystack), Some(6)); + assert_eq!(memchr(b'5', haystack), Some(7)); + assert_eq!(memchr(b'6', haystack), Some(8)); + assert_eq!(memchr(b'7', haystack), None); + assert_eq!(memchr(b'a', haystack), Some(3)); + assert_eq!(memchr(b'b', haystack), Some(4)); + assert_eq!(memchr(b'c', haystack), Some(5)); + assert_eq!(memchr(b'd', haystack), None); + assert_eq!(memchr(b'A', haystack), None); + assert_eq!(memchr(0, haystack), Some(9)); + assert_eq!(memchr(0xff, haystack), Some(10)); + assert_eq!(memchr(0xfe, haystack), None); + assert_eq!(memchr(1, haystack), None); + assert_eq!(memchr(b'\n', haystack), Some(14)); + assert_eq!(memchr(b'\r', haystack), None); + } + + #[test] + fn memchr_all() { + let mut arr = Vec::new(); + for b in 0..=255 { + arr.push(b); + } + for b in 0..=255 { + assert_eq!(memchr(b, &arr), Some(b as usize)); + } + arr.reverse(); + for b in 0..=255 { + assert_eq!(memchr(b, &arr), Some(255 - b as usize)); + } + } + + #[test] + fn memchr_empty() { + for b in 0..=255 { + assert_eq!(memchr(b, b""), None); + } + } +} diff --git a/tokio/src/util/mod.rs b/tokio/src/util/mod.rs index 9f6119acb..b1afc5716 100644 --- a/tokio/src/util/mod.rs +++ b/tokio/src/util/mod.rs @@ -76,3 +76,6 @@ cfg_rt_multi_thread! { pub(crate) mod trace; pub(crate) mod error; + +#[cfg(feature = "io-util")] +pub(crate) mod memchr;