name: CI
on:
pull_request:
push:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
features: [--no-default-features, --all-features]
steps:
- uses: actions/checkout@v6
- name: update toolchain
run: rustup update stable && rustup default stable
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.features }}
- name: rustfmt
run: cargo fmt -- --check --config "unstable_features=true,imports_granularity=Crate,group_imports=StdExternalCrate,format_code_in_doc_comments=true"
- name: clippy
run: cargo clippy ${{ matrix.features }} --all-targets -- -D warnings
- name: test
run: cargo test ${{ matrix.features }}
- name: check doc
run: cargo doc
env:
RUSTDOCFLAGS: "-Dwarnings"
msrv:
name: check msrv
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
toolchain: "1.70"
- uses: Swatinem/rust-cache@v2
- run: cargo +1.70 check
- run: cargo +1.70 check --no-default-features
loom:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: Swatinem/rust-cache@v2
- name: clippy
run: cargo clippy
env:
RUSTFLAGS: "--cfg loom"
- name: loom
run: cargo test --tests --release
env:
RUSTFLAGS: --cfg loom -C debug_assertions
LOOM_MAX_PREEMPTIONS: 2
benchmark:
needs: test
strategy:
matrix:
os: [ubuntu-24.04, ubuntu-24.04-arm]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- uses: Swatinem/rust-cache@v2
- name: benchmark maillon
run: cargo bench --all-features --bench notify --bench semaphore -- --warm-up-time 1 --measurement-time 1
- name: benchmark maillon lazy linked
run: cargo bench --all-features --bench notify_lazy_linked --bench semaphore_lazy_linked -- --warm-up-time 1 --measurement-time 1
- name: benchmark tokio
run: cargo bench --all-features --bench tokio_notify --bench tokio_semaphore -- --warm-up-time 1 --measurement-time 1
miri:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: install miri
run: rustup install nightly && rustup +nightly component add miri
- uses: Swatinem/rust-cache@v2
- name: miri
run: cargo +nightly miri test --tests
env:
MIRIFLAGS: -Zmiri-permissive-provenance
compute-miri-seeds:
runs-on: ubuntu-latest
outputs:
seeds: ${{ steps.compute-seeds.outputs.seeds }}
steps:
- id: compute-seeds
run: python3 -c "print('seeds=' + str([f'{i}..{i+$TOTAL//$RUNNERS}' for i in range(0,$TOTAL,$TOTAL//$RUNNERS)]))" >> $GITHUB_OUTPUT
env:
TOTAL: 2048
RUNNERS: 32
miri-seeds:
needs: [ test, compute-miri-seeds ]
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
seeds: ${{ fromJson(needs.compute-miri-seeds.outputs.seeds) }}
steps:
- uses: actions/checkout@v6
- name: install miri
run: rustup install nightly && rustup +nightly component add miri
- uses: Swatinem/rust-cache@v2
- name: miri
run: cargo +nightly miri test --test list --test wait_list --test miri_notify --test miri_semaphore
env:
MIRIFLAGS: -Zmiri-many-seeds=${{ matrix.seeds }} -Zmiri-compare-exchange-weak-failure-rate=0 -Zmiri-permissive-provenance
RUSTFLAGS: --cfg skip_single_threaded