diff --git a/.cargo/config.toml b/.cargo/config.toml index 03a995c7..f96081ae 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -5,18 +5,21 @@ ci-doctest = "test --workspace --all-features --doc --no-fail-fast -- --nocaptur # just check the library (without dev deps) ci-check-min = "hack --workspace check --no-default-features" -ci-check-lib = "hack --workspace --feature-powerset --exclude-features io-uring check" +ci-check-lib = "hack --workspace --feature-powerset --exclude-features=io-uring check" ci-check-lib-linux = "hack --workspace --feature-powerset check" # check everything -ci-check = "hack --workspace --feature-powerset --exclude-features io-uring check --tests --examples" +ci-check = "hack --workspace --feature-powerset --exclude-features=io-uring check --tests --examples" ci-check-linux = "hack --workspace --feature-powerset check --tests --examples" # tests avoiding io-uring feature ci-test = "hack test --workspace --exclude=actix-rt --exclude=actix-server --all-features --lib --tests --no-fail-fast -- --nocapture" -ci-test-rt = " hack --feature-powerset --exclude-features io-uring test --package=actix-rt --lib --tests --no-fail-fast -- --nocapture" -ci-test-server = "hack --feature-powerset --exclude-features io-uring test --package=actix-server --lib --tests --no-fail-fast -- --nocapture" +ci-test-rt = " hack --feature-powerset --exclude-features=io-uring test --package=actix-rt --lib --tests --no-fail-fast -- --nocapture" +ci-test-server = "hack --feature-powerset --exclude-features=io-uring test --package=actix-server --lib --tests --no-fail-fast -- --nocapture" # test with io-uring feature ci-test-rt-linux = " hack --feature-powerset test --package=actix-rt --lib --tests --no-fail-fast -- --nocapture" ci-test-server-linux = "hack --feature-powerset test --package=actix-server --lib --tests --no-fail-fast -- --nocapture" + +# test lower msrv +ci-test-lower-msrv = "hack --workspace --feature-powerset test --lib --tests --no-fail-fast -- --nocapture" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 45841fb8..9a0b9c1f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: - { name: Windows (MinGW), os: windows-latest, triple: x86_64-pc-windows-gnu } - { name: Windows (32-bit), os: windows-latest, triple: i686-pc-windows-msvc } version: - - 1.46.0 # MSRV + - 1.52.0 # MSRV for -server and -tls - stable - nightly @@ -64,8 +64,7 @@ jobs: # - name: Generate Cargo.lock # uses: actions-rs/cargo@v1 - # with: - # command: generate-lockfile + # with: { command: generate-lockfile } # - name: Cache Dependencies # uses: Swatinem/rust-cache@v1.2.0 @@ -117,26 +116,66 @@ jobs: cargo ci-test-rt-linux cargo ci-test-server-linux - - name: Generate coverage file - if: > - matrix.target.os == 'ubuntu-latest' - && matrix.version == 'stable' - && github.ref == 'refs/heads/master' + - name: Clear the cargo caches run: | - cargo install cargo-tarpaulin - cargo tarpaulin --out Xml --verbose - - name: Upload to Codecov - if: > - matrix.target.os == 'ubuntu-latest' - && matrix.version == 'stable' - && github.ref == 'refs/heads/master' - uses: codecov/codecov-action@v1 - with: { file: cobertura.xml } + cargo install cargo-cache --version 0.6.2 --no-default-features --features ci-autoclean + cargo-cache + + build_and_test_lower_msrv: + name: Linux / 1.46 (lower MSRV) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Install 1.46.0 # MSRV for all but -server and -tls + uses: actions-rs/toolchain@v1 + with: + toolchain: 1.46.0-x86_64-unknown-linux-gnu + profile: minimal + override: true + + - name: Install cargo-hack + uses: actions-rs/cargo@v1 + with: + command: install + args: cargo-hack + + - name: tests + run: cargo ci-test-lower-msrv - name: Clear the cargo caches run: | cargo install cargo-cache --version 0.6.2 --no-default-features --features ci-autoclean cargo-cache + + coverage: + name: coverage + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Install Rust (nightly) + uses: actions-rs/toolchain@v1 + with: + toolchain: stable-x86_64-unknown-linux-gnu + profile: minimal + override: true + + - name: Generate Cargo.lock + uses: actions-rs/cargo@v1 + with: { command: generate-lockfile } + - name: Cache Dependencies + uses: Swatinem/rust-cache@v1.3.0 + + - name: Generate coverage file + if: github.ref == 'refs/heads/master' + run: | + cargo install cargo-tarpaulin + cargo tarpaulin --out Xml --verbose + - name: Upload to Codecov + if: github.ref == 'refs/heads/master' + uses: codecov/codecov-action@v1 + with: { file: cobertura.xml } rustdoc: name: rustdoc diff --git a/actix-codec/src/framed.rs b/actix-codec/src/framed.rs index a3a13f4d..5345314b 100644 --- a/actix-codec/src/framed.rs +++ b/actix-codec/src/framed.rs @@ -178,7 +178,7 @@ impl Framed { U: Decoder, { loop { - let mut this = self.as_mut().project(); + let this = self.as_mut().project(); // Repeatedly call `decode` or `decode_eof` as long as it is "readable". Readable is // defined as not having returned `None`. If the upstream has returned EOF, and the // decoder is no longer readable, it can be assumed that the decoder will never become @@ -186,7 +186,7 @@ impl Framed { if this.flags.contains(Flags::READABLE) { if this.flags.contains(Flags::EOF) { - match this.codec.decode_eof(&mut this.read_buf) { + match this.codec.decode_eof(this.read_buf) { Ok(Some(frame)) => return Poll::Ready(Some(Ok(frame))), Ok(None) => return Poll::Ready(None), Err(e) => return Poll::Ready(Some(Err(e))), @@ -195,7 +195,7 @@ impl Framed { log::trace!("attempting to decode a frame"); - match this.codec.decode(&mut this.read_buf) { + match this.codec.decode(this.read_buf) { Ok(Some(frame)) => { log::trace!("frame decoded from buffer"); return Poll::Ready(Some(Ok(frame))); diff --git a/actix-macros/Cargo.toml b/actix-macros/Cargo.toml index ea1b51d0..bfda142d 100644 --- a/actix-macros/Cargo.toml +++ b/actix-macros/Cargo.toml @@ -22,4 +22,5 @@ syn = { version = "^1", features = ["full"] } actix-rt = "2.0.0" futures-util = { version = "0.3.7", default-features = false } +rustversion = "1" trybuild = "1" diff --git a/actix-macros/src/lib.rs b/actix-macros/src/lib.rs index 4be79178..dae08681 100644 --- a/actix-macros/src/lib.rs +++ b/actix-macros/src/lib.rs @@ -198,5 +198,5 @@ pub fn test(args: TokenStream, item: TokenStream) -> TokenStream { fn input_and_compile_error(mut item: TokenStream, err: syn::Error) -> TokenStream { let compile_err = TokenStream::from(err.to_compile_error()); item.extend(compile_err); - return item; + item } diff --git a/actix-macros/tests/trybuild.rs b/actix-macros/tests/trybuild.rs index c7f4a5ca..2af99636 100644 --- a/actix-macros/tests/trybuild.rs +++ b/actix-macros/tests/trybuild.rs @@ -1,3 +1,4 @@ +#[rustversion::stable(1.46)] // MSRV #[test] fn compile_macros() { let t = trybuild::TestCases::new(); diff --git a/actix-rt/src/system.rs b/actix-rt/src/system.rs index 4f262ede..2b44ad6a 100644 --- a/actix-rt/src/system.rs +++ b/actix-rt/src/system.rs @@ -155,6 +155,7 @@ impl System { pub struct SystemRunner { rt: Runtime, stop_rx: oneshot::Receiver, + #[allow(dead_code)] system: System, } diff --git a/actix-server/src/accept.rs b/actix-server/src/accept.rs index d9451d37..504f452d 100644 --- a/actix-server/src/accept.rs +++ b/actix-server/src/accept.rs @@ -81,14 +81,9 @@ struct Accept { } /// Array of u128 with every bit as marker for a worker handle's availability. +#[derive(Debug, Default)] struct Availability([u128; 4]); -impl Default for Availability { - fn default() -> Self { - Self([0; 4]) - } -} - impl Availability { /// Check if any worker handle is available #[inline(always)] diff --git a/actix-server/src/worker.rs b/actix-server/src/worker.rs index b99b2da2..ffe36f61 100644 --- a/actix-server/src/worker.rs +++ b/actix-server/src/worker.rs @@ -181,6 +181,7 @@ impl WorkerHandleAccept { /// Held by [ServerBuilder](crate::builder::ServerBuilder). #[derive(Debug)] pub(crate) struct WorkerHandleServer { + #[allow(dead_code)] idx: usize, tx: UnboundedSender, } diff --git a/actix-service/examples/clone.rs b/actix-service/examples/clone.rs new file mode 100644 index 00000000..1f61a648 --- /dev/null +++ b/actix-service/examples/clone.rs @@ -0,0 +1,33 @@ +use std::{future::Future, sync::mpsc, time::Duration}; + +async fn oracle(f: F) -> (u32, u32) +where + F: FnOnce() -> Fut + Clone + Send + 'static, + Fut: Future + 'static, +{ + let f1 = actix_rt::spawn(f.clone()()); + let f2 = actix_rt::spawn(f()); + + (f1.await.unwrap(), f2.await.unwrap()) +} + +#[actix_rt::main] +async fn main() { + let (tx, rx) = mpsc::channel(); + + let (r1, r2) = oracle({ + let tx = tx.clone(); + + || async move { + tx.send(()).unwrap(); + 4 * 4 + } + }) + .await; + assert_eq!(r1, r2); + + tx.send(()).unwrap(); + + rx.recv_timeout(Duration::from_millis(100)).unwrap(); + rx.recv_timeout(Duration::from_millis(100)).unwrap(); +} diff --git a/actix-service/src/fn_service.rs b/actix-service/src/fn_service.rs index 8c1a6f51..f83ef81f 100644 --- a/actix-service/src/fn_service.rs +++ b/actix-service/src/fn_service.rs @@ -52,9 +52,9 @@ pub fn fn_factory( f: F, ) -> FnServiceNoConfig where - Srv: Service, F: Fn() -> Fut, Fut: Future>, + Srv: Service, { FnServiceNoConfig::new(f) } diff --git a/actix-tls/Cargo.toml b/actix-tls/Cargo.toml index 00082278..3ac1f296 100755 --- a/actix-tls/Cargo.toml +++ b/actix-tls/Cargo.toml @@ -4,9 +4,7 @@ version = "3.0.0-beta.5" authors = ["Nikolay Kim "] description = "TLS acceptor and connector services for Actix ecosystem" keywords = ["network", "tls", "ssl", "async", "transport"] -homepage = "https://actix.rs" repository = "https://github.com/actix/actix-net.git" -documentation = "https://docs.rs/actix-tls" categories = ["network-programming", "asynchronous"] license = "MIT OR Apache-2.0" edition = "2018" diff --git a/clippy.toml b/clippy.toml new file mode 100644 index 00000000..f691ea3d --- /dev/null +++ b/clippy.toml @@ -0,0 +1 @@ +msrv = "1.48"