PackageTrack
Sign in Get early access

shuttle

A library for testing concurrent Rust code

0.9.3 5.1M downloads/mo #4477 most downloaded on crates.io awslabs/shuttle

What this package is like to depend on

Last release 3 days ago

20 Aug 2026

Release timing varies

gaps range from 8 days to 10 months

Nearly every release is documented

notes for 23 of 24 stable releases

Nothing withdrawn

no release was ever pulled

6 years old

24 releases · first in 2020

4 releases in the last 12 months

see the full history below

Release timeline

24 releases · Oct 2020 to Aug 2026
2021 2022 2023 2024 2025 2026
Release Pre-release

Releases

latest 24
  1. 0.9.3 20 Aug 2026
    Release notes
    • Fix BatchSemaphore waking the wrong task when an Acquire future is polled by a task other than the one that created it (the motivating case is an in-flight acquire cached inside a longer-lived object, such as a tokio Receiver that is moved between tasks). Waiters left behind by a cancelled Acquire whose task has since finished are now also treated as stale instead of consuming permits or blocking a finished task. (#317)
    • Performance: schedule no longer iterates over tasks that have already finished. This does not change scheduling decisions. (#318)
    • Add READMEs for shuttle-engine, shuttle-schedulers, shuttle-std and the wrapper crates. Make shuttle-async-stream-impl publishable. (#315)
    • Fix doc comment paths that got broken in the crate refactoring.
    • Publish shuttle-engine, shuttle-schedulers and shuttle-std 0.1.1.
    Open source →
    Release notes
    • Fix BatchSemaphore waking the wrong task when an Acquire future is polled by a task other than the one that created it (the motivating case is an in-flight acquire cached inside a longer-lived object, such as a tokio Receiver that is moved between tasks). Waiters left behind by a cancelled Acquire whose task has since finished are now also treated as stale instead of consuming permits or blocking a finished task. (#317)
    • Performance: schedule no longer iterates over tasks that have already finished. This does not change scheduling decisions. (#318)
    • Add READMEs for shuttle-engine, shuttle-schedulers, shuttle-std and the wrapper crates. Make shuttle-async-stream-impl publishable. (#315)
    • Fix doc comment paths that got broken in the crate refactoring.
    • Publish shuttle-engine, shuttle-schedulers and shuttle-std 0.1.1.
    Open source →
  2. 0.9.2 12 Aug 2026
    Release notes
    • Add support for 128-bit atomics (AtomicI128/AtomicU128) (#299)
    • Implement Display for TaskId to match tokio's task::Id (#307)
    • Add support for task abort (#278)
    • Refactor the shuttle crate into separate internal crates: shuttle-engine (core runtime and the Scheduler trait), shuttle-schedulers (built-in schedulers and check/replay helpers), and shuttle-std (the std replacement primitives) (#286, #290, #292, #294). This is an internal reorganization and does not change the shuttle public API.
    • Publish shuttle-std, shuttle-schedulers and shuttle-engine.
    Open source →
    Release notes
    • Add support for 128-bit atomics (AtomicI128/AtomicU128) (#299)
    • Implement Display for TaskId to match tokio's task::Id (#307)
    • Add support for task abort (#278)
    • Refactor the shuttle crate into separate internal crates: shuttle-engine (core runtime and the Scheduler trait), shuttle-schedulers (built-in schedulers and check/replay helpers), and shuttle-std (the std replacement primitives) (#286, #290, #292, #294). This is an internal reorganization and does not change the shuttle public API.
    • Publish shuttle-std, shuttle-schedulers and shuttle-engine.
    Open source →
  3. 0.9.1 21 Apr 2026
    Release notes
    • Readd README that was lost in refactoring. (#276)
    Open source →
    Release notes
    • Readd README that was lost in refactoring. (#276)
    Open source →
  4. 0.9.0 20 Apr 2026
    Release notes
    • Fix: JoinHandle<T> is now Send and Sync even if T is not.
    • Gate vector clocks behind the vector-clocks feature flag. (#187)
    • Fix: Once can now be moved (#188 and #208)
    • Various performance improvements (#191, #211)
    • std::sync::{LockResult, PoisonError, TryLockError, TryLockResult} are now exported from shuttle::sync (#198)
    • Task names are now logged in the step span (#206)
    • Task backtraces are now printed on deadlock if the SHUTTLE_BACKTRACE environment variable is set (#205, #213)
    • Spawn events are now traced at DEBUG (down from INFO) (#211)
    • Stable resource ids (#207)
    • UniformRandomWalk scheduler added (#200)
    • Panic path refactored. 1: Aborting panics should more often have their schedule serialized, 2: Schedule is no longer part of the panic message, 3: There will now be multiple schedules serialized on multiple panics, 4: if Config::immediately_return_on_panic is set then we will return immediately on a failure and not finish unwinding the panic. (#202)
    • Change scheduling points to always precede operations (#216)
    • Change the backend for the tasks to be the Corosensei crate instead of the generators crate (#204)
    • Add SHUTTLE_PERSIST_SEED in the RandomScheduler to persist schedule before running the test (to be used for aborting tests) (#201)
    • Add BatchSemaphore::close_no_scheduling_point (#227)
    • Add config for ungraceful shutdowns (#230)
    • Add {RwLock, Mutex}::clear_poison (#233)
    • Bump to rand 0.8.6 (#264)
    Open source →
    Release notes
    • Fix: JoinHandle<T> is now Send and Sync even if T is not.
    • Gate vector clocks behind the vector-clocks feature flag. (#187)
    • Fix: Once can now be moved (#188 and #208)
    • Various performance improvements (#191, #211)
    • std::sync::{LockResult, PoisonError, TryLockError, TryLockResult} are now exported from shuttle::sync (#198)
    • Task names are now logged in the step span (#206)
    • Task backtraces are now printed on deadlock if the SHUTTLE_BACKTRACE environment variable is set (#205, #213)
    • Spawn events are now traced at DEBUG (down from INFO) (#211)
    • Stable resource ids (#207)
    • UniformRandomWalk scheduler added (#200)
    • Panic path refactored. 1: Aborting panics should more often have their schedule serialized, 2: Schedule is no longer part of the panic message, 3: There will now be multiple schedules serialized on multiple panics, 4: if Config::immediately_return_on_panic is set then we will return immediately on a failure and not finish unwinding the panic. (#202)
    • Change scheduling points to always precede operations (#216)
    • Change the backend for the tasks to be the Corosensei crate instead of the generators crate (#204)
    • Add SHUTTLE_PERSIST_SEED in the RandomScheduler to persist schedule before running the test (to be used for aborting tests) (#201)
    • Add BatchSemaphore::close_no_scheduling_point (#227)
    • Add config for ungraceful shutdowns (#230)
    • Add {RwLock, Mutex}::clear_poison (#233)
    • Bump to rand 0.8.6 (#264)
    Open source →
  5. 0.8.1 20 Jun 2025
    Release notes

    0.8.1 (Jun 19, 2025)

    • Fix bug in BatchSemaphore (#167)
    • Fix bug in RwLock (#170)
    • Add current::reset_step_count (#175)
    • Add spawn_local (#176)
    • Add thread::scope (#181)
    • Add AbortHandle (#182)
    Open source →
    Release notes
    • Fix bug in BatchSemaphore (#167)
    • Fix bug in RwLock (#170)
    • Add current::reset_step_count (#175)
    • Add spawn_local (#176)
    • Add thread::scope (#181)
    • Add AbortHandle (#182)
    Open source →
  6. 0.8.0 12 Oct 2024
    Release notes
    • Add BatchSemaphore (#151)
    • block_on now has one less thread switch point, which breaks schedules. (#155)
    • ReplayScheduler::set_target_clock added (#156)
    • Schedulers now receive references to Tasks instead of TaskIds (#156)
    • Expose check_random_with_seed (#161)
    • Make check_random optionally take a seed by providing the environment variable SHUTTLE_RANDOM_SEED (#161)
    • Shuttle Explorer extension (#163).
    • AnnotationScheduler and annotated schedule support added under feature "annotation" (#163)
    Open source →
  7. 0.7.1 31 May 2024
    Release notes
    • Implement try_send and iterators for mpsc channels (#120)
    • Implement get_mut for Mutex and RwLock (#120)
    Open source →
  8. 0.7.0 07 Mar 2024
    Release notes
    • Add support for task labels. These replace task tags, which are deprecated and will be removed in a future release. (#138)
    • In the meantime, Tags are now implemented with a trait. This is a breaking change from 0.6.1. (#111)
    • Implement is_finished() for future::JoinHandle (#118)
    Open source →
    Release notes
    • Add support for task labels. These replace task tags, which are deprecated and will be removed in a future release. (#138)
    • In the meantime, Tags are now implemented with a trait. This is a breaking change from 0.6.1. (#111)
    • Implement is_finished() for future::JoinHandle (#118)
    Open source →
  9. 0.6.1 23 May 2023
    Release notes
    • Add feature to tag tasks (#98)
    • Add scheduler to check for uncontrolled nondeterminism (#96, #97)
    • Support spurious wakeups for thread::park (#101)
    • Support different leaders when sync::Barrier is reused (#102)
    • Make {Mutex, Condvar, RwLock}::new const (#106)
    • Improve tracing spans (#99)
    • Fix spurious deadlocks with FuturesUnordered (#105)
    • Split schedule output over multiple lines (#103)
    • Bump futures dependency (#107)
    Open source →
    Release notes
    • Add feature to tag tasks (#98)
    • Add scheduler to check for uncontrolled nondeterminism (#96, #97)
    • Support spurious wakeups for thread::park (#101)
    • Support different leaders when sync::Barrier is reused (#102)
    • Make {Mutex, Condvar, RwLock}::new const (#106)
    • Improve tracing spans (#99)
    • Fix spurious deadlocks with FuturesUnordered (#105)
    • Split schedule output over multiple lines (#103)
    • Bump futures dependency (#107)
    Open source →
  10. 0.6.0 25 Jan 2023
    Release notes

    This version renames the silence_atomic_ordering_warning configuration option to silence_warnings, as well as the corresponding environment variables, to enable future warnings to be controlled by the same mechanism.

    • Implement lazy_static support (#93)
    Open source →
    Release notes

    This version renames the silence_atomic_ordering_warning configuration option to silence_warnings, as well as the corresponding environment variables, to enable future warnings to be controlled by the same mechanism.

    • Implement lazy_static support (#93)
    Open source →
  11. 0.5.0 23 Nov 2022
    Release notes

    This version updates the embedded rand library to v0.8. Tests that use shuttle::rand will need to update to the v0.8 interface of rand, which included some breaking changes.

    • Update rand and other dependencies (#89)
    • Implement abort for future::JoinHandle (#87)
    • Correctly handle the main thread's thread-local storage destructors (#88)
    Open source →
    Release notes

    This version updates the embedded rand library to v0.8. Tests that use shuttle::rand will need to update to the v0.8 interface of rand, which included some breaking changes.

    • Update rand and other dependencies (#89)
    • Implement abort for future::JoinHandle (#87)
    • Correctly handle the main thread's thread-local storage destructors (#88)
    Open source →
  12. 0.4.1 14 Nov 2022
    Release notes
    • Make PCT scheduling not linear in max number of tasks (#84)
    Open source →
  13. 0.4.0 29 Oct 2022
    Release notes
    • Dependency updates
    Open source →
  14. 0.3.0 01 Sep 2022
    Release notes

    Note that clients using async primitives provided by Shuttle (task spawn, block_on, yield_now) will need to be updated due to the renaming of the asynch module to future in this release.

    • Rust 2021 conversion and dependency bumps (#76)
    • Implement thread::park and thread::unpark (#77)
    • Implement std::hint (#78)
    • Rename the asynch module to future (#79)
    Open source →
  15. 0.2.0 07 Jul 2022
    Release notes

    Note that failing test schedules created by versions of Shuttle before 0.2.0 will not successfully replay on version 0.2.0, and vice versa, as the changes below affect Mutex and RwLock scheduling decisions.

    • Implement Mutex::try_lock (#71)
    • Implement RwLock::{try_read, try_write} (#72)
    • Export a version of std::sync::Weak (#69)
    • Provide better error messages for deadlocks caused by non-reentrant locking (#66)
    Open source →
  16. 0.1.0 11 Apr 2022
    Release notes
    • Implement Condvar::wait_while and Condvar::wait_timeout_while (#59)
    • Remove implicit Sized bounds on Mutex and RwLock (#62)
    • Dependency updates (#58, #60)
    Open source →
  17. 0.0.7 21 Sep 2021
    Release notes
    • Fix a number of issues in support for async tasks (#50, #51, #52, #54)
    • Improve error messages when using Shuttle primitives outside a Shuttle test (#42)
    • Add support for thread local storage (the thread_local! macro) (#43, #53)
    • Add support for Once cells (#49)
    • Simplify some dependencies to improve build times (#55)
    • Move context_switches and my_clock functions into a new current module (#56)
    Open source →
  18. 0.0.6 08 Jul 2021
    Release notes
    • Add support for std::sync::atomic (#33)
    • Add shuttle::context_switches to get a logical clock for an execution (#37)
    • Track causality between threads (#38)
    • Better handling for double panics and poisoned locks (#30, #40)
    • Add option to not persist failures (#34)
    Open source →
  19. 0.0.5 11 Jun 2021
    Release notes
    • Fix a performance regression with tracing introduced by #24 (#31)
    • Include default features for the rand crate to fix compilation issues (#29)
    Open source →
  20. 0.0.4 02 Jun 2021
    Release notes
    • Add a timeout option to run tests for a fixed amount of time (#25)
    • Include task ID in all tracing log output (#24)
    • Implement thread::current (#23)
    Open source →
  21. 0.0.3 13 Apr 2021
    Release notes
    • Update for Rust 1.51 (#11)
    • Add option to bound how many steps a test runs on each iterations (#14)
    • Remove option to configure the maximum number of threads/tasks (#16, #19)
    • Make yield_now a hint to the scheduler to allow validating busy loops (#18)
    • Add ReplayScheduler::new_from_file (#20)
    Open source →
  22. 0.0.2 19 Mar 2021
    Release notes
    • Add Default impl to RwLock (#7)
    • Add option to persist schedules to a file (#4)
    Open source →
  23. 0.0.1 03 Mar 2021
    Release notes
    • Initial release
    Open source →
  24. 0.0.0 04 Oct 2020

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive