# Significant feature changes and additions This project follows Rust semantic versioning. ## 0.2.11 (2024-05-28) - Fixups for Rust 1.78 warnings and clippy recommendations ### Added - `Core::anymap_unset` to clear a stored anymap value ## 0.2.10 (2023-08-06) - MSRV changed to 1.63 from 1.60, because testing now requires const Mutex::new ### Fixed Big testing refactor and rework: - No longer depend on broken `RUST_TEST_THREADS=1` - No longer depend on previous script-based workaround - Get rid of old `test-multi-thread` workaround - Under `cargo test`, when single-threaded testing is required, run a worker thread to force all tests to run on a single thread - However MIRI testing continues to use script-based workaround ## 0.2.9 (2023-07-24) ### Added - `Channel` to send messages to a Stakker thread from any other thread ## 0.2.8 (2023-07-14) ### Added - Test MSRV of 1.60 - Use Rust 2021 edition ### Fixed - Replaced unmaintained `anymap` crate with simple safe inline implementation ## 0.2.7 (2023-05-09) ### Added - `LogLevel::try_from(u8)` plus derives: Hash, Ord, PartialOrd ## 0.2.6 (2023-03-29) ### Fixed - Fixed build failure when "no-unsafe-queue" feature was enabled alone - Testing has been improved to catch any other similar issues ## 0.2.5 (2022-06-11) (maintenance) ## 0.2.4 (2021-05-14) ### Added - `ActorOwnSlab` / `actor_in_slab!` for basic child actor housekeeping - `query!` macro for convenient access to `Actor::query` - `Core::start_instant()` to get runtime startup time - `ShareWeak` for weak references to `Share` items ### Documentation - `examples/` folder ## 0.2.3 (2021-04-22) ### Fixed - On actor `stop!` or `fail!`, if further failures are reported before the actor method returns, the first stop/fail is now kept and later ones are discarded, since the first failure is closer to the origin of the problem. ## 0.2.2 (2021-04-06) ### Added - Minimum support for asynchronous tasks, in `task` module ## 0.2.1 (2021-02-25) (only documentation changes) ## 0.2.0 (2020-11-08) ### Breaking changes - `PipedThread::new` argument order changed, to avoid need for temporaries when called - `Actor::kill`, `Actor::kill_str` and `Actor::owned` moved to `ActorOwn`. This constrains the power to kill an actor and create new owners to just owners. Also `kill_str` now only handles `&'static str`, with `kill_string` added for `String`. If you need to kill an actor using just an `Actor` reference, then the actor needs a method added that calls `fail!` - `Cx::fail_str` now only handles `&'static str`. `Cx::fail_string` can be used for `String`. `fail!` macro now abstracts this. - `ActorOwn::new` now requires a parent-ID argument. `actor!` and `actor_new!` macros are unchanged. - `StopCause` adds `StopCause::Lost` to allow for future implementation of remote actors ### Added - "logger" feature for optional logging support. If enabled, every actor gets an span-ID. Actor start and stop are logged, with failure reasons. All logging from an actor uses the span-ID and supports formatted text and key-value pairs. Logging is synchronization-free and is directed to a per-Stakker logging handler, which can output directly, or forward to a logging crate, or forward to the logging system of the host event loop as required - `fail!`, `stop!` and `kill!` to express actor termination more conveniently, including with formatted strings - `ret_fail!` and `ret_failthru!` to easily cascade actor failure ### Changed - `Stakker::anymap_set` moved to `Core::anymap_set` so that actors can set anymap values more conveniently. ## 0.1.4 (2020-09-27) ### Added - `Core::share_rw2` and `Core::share_rw3` to allow borrowing 2 or 3 `Share` instances at once - Allow using `_` in initial closure arguments within macros. For example `|_this, _cx|` can now be written `|_, _|` ### Fixed - `PipedThread` now notifies thread as documented if the actor holding the `PipedThread` dies. - `PipedThread` now reports back panic string correctly if thread panics and the panic was made with a `String` or `&str`. - A timer set at `cx.now()` in virtual time now executes correctly. - The flat `FnOnce` queue has been fixed to run cleanly under MIRI ### Testing - Stress tests of `Waker` across threads (to detect races) - Stress test of flat `FnOnce` queue expansion - Fuzz-testing of timer queue - Fuzz-testing of flat `FnOnce` queue - Unit tests of queue and timers using small corpora derived from fuzz tests - Unit tests for `Actor`, `StopCause`, `Share`, `Waker` and `PipedThread` - Coverage now at 91% - Tests pass when running under MIRI ## 0.1.3 (2020-08-27) ### Added - Virtual SystemTime: `cx.systime()` and `stakker.set_systime()` - Synchronous actor queries from outside runtime: `actor.query()` ### Changed - 'flat' FnOnce queue simplifications and improvements - Global-based Deferrer access is now branch-free - General optimisations on hot paths ### Fixed - Fixed memory leak in 'flat' FnOnce queue cleanup - Fixed memory leak in Stakker cleanup with inline Deferrer - Fixed issue with TLS-based Deferrer on cleanup ### Testing - Valgrind testing script ## 0.1.2 (2020-07-16) ### Added - `actor_of_trait!` - `ActorOwnAnon` ## 0.1.1 (2020-06-20) ### Changed - Use `$crate::` instead of `stakker::` for macros - Accept trailing comma in more places in macro args - `'static` on `Actor::apply_prep` is not necessary ## 0.1.0 (2020-04-04) ### Changed - For `call!`-family and `fwd_to!`-family macros using closures, no longer require `move` keyword and make all closures implicitly `move` so that they are `'static` ## 0.0.2 (2020-03-04) ### Added - `Ret` type for compile-time checking of single use, instead of old `fwd_once_to!` implementation (now dropped). - `cx: CX![]` to save on actor method boiler-plate ### Changed - Big change to notation within macros, using `[]` to contain the context (`Cx` / `Actor` / `Core`) that the call is targetted towards, which eliminates need for `__` arguments. This is still valid Rust syntax, so is formatted automatically by rustfmt. `Fwd` handling split out of `call!` into `fwd!`. Error reporting of errors in macro args improved. - Multiple `ActorOwn` refs to an actor are now permitted, and the ref'd actor is terminated only when the last one goes away - `Deferrer` is now the main queue, not the lazy queue. This is to avoid the lazy queue ballooning whilst there's a lot still going on on the main queue. - `Core::timer_max` dropped in favour of `timer_max!` macro which is more efficient. Similarly for `timer_min`. ### Testing - Coverage testing with kcov, and many more tests. Includes coverage testing of macros. ## 0.0.1 (2020-01-23) First public release