maillon 0.1.0

A concurrent intrusive list for building synchronization primitives.
Documentation
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