All notable changes to this project will be documented in this file.
- Add bounded MPMC
reserveandtry_reservemethods returning a borrowedPermit, so callers can wait for capacity before constructing a value; sends and reservations receive capacity in wait-queue order, and unused permits release it.
- Prevent deadlocks in
singleflight::Group::workandtry_workwhen a duplicate key's destructor calls back into the same group.
- Executor waker operations, including cloning, waking, and dropping, are expected not to panic; recovery from panicking waker callbacks is no longer supported.
- Add
event::AutoResetEvent, a reusable signal that releases one waiter, retains at most one unassigned signal that can be cleared withreset, and transfers assigned signals when waits are cancelled. - Add
ManualResetEvent::try_waitto check readiness without registering a waiter or consuming the set state. - Implement
broadcast::mpmc::bounded, a lossless bounded broadcast channel that retains at most the requested capacity and makes producers wait for the slowest active receiver. - Add opt-in bounded and unbounded
asyncband::spmcqueues with one non-cloneable sender requiring exclusive access, cloneable competing receivers, and cancellation-safe receive notification handoff. - Add opt-in bounded and unbounded
asyncband::mpmcqueues with cloneable producers and competing consumers, delivering each accepted value to exactly one receiver while a receiver remains. - Add an opt-in runtime-agnostic
Phaserwith shared observer handles, dynamic RAII participants registered individually or in batches through an owning iterator,u64phase numbers, split arrival/wait with cancellation-resilient retries, and acloseoperation that releases unfinished waits withClosed. - Add bounded MPSC
reserveandtry_reservemethods returning aPermit, allowing callers to wait for capacity before constructing a message; pending sends and reservations receive capacity in wait-queue order, and unused permits release capacity without claiming message order.
- Complete semaphore permit releases and notify all eligible waiters even if a wake callback panics.
- Release MPSC receiver wakers when the receiver is dropped, avoiding retained tasks and ownership cycles when a waker holds a sender.
- Notify all blocked bounded MPSC senders on receiver disconnection even when a buffered message destructor panics.
- Allow
Condvarwaits with unsized mutex contents, including slices and trait objects, for both borrowed and owned guards. - Allow manual unbounded pools to use non-
Sendfactory closures withget_or_create, including factories that borrow task-local state. - Allow
watch::channelto store non-Clonevalues for publication and change notification; only owning reads throughReceiver::getandReceiver::recvrequireClone. - Finish releasing buffered bounded MPSC messages even if one message destructor panics.
- Improve unbounded MPSC throughput with batched receiving and incremental storage reclamation; empty-buffer retention is bounded independently of previous peak occupancy.
- Make completed and abandoned
Completionwaits lock-free while preserving cancellable pending registration. - Reduce allocations when notifying waiters in Barrier, broadcast, condvar, event, MPSC, and watch.
- Preserve applicable third-party licensing and copyright notices on derived source files, and record exact provenance mappings in
LICENSEand source comments.
This is an interim non-ASF release. It has not been approved by the Apache Incubator PMC and is not an act of the Apache Software Foundation.
- Correct source-header treatment and make third-party derivation and test provenance records more precise in source distributions.
This non-ASF release was not approved by the Apache Incubator PMC, is not an act of the Apache Software Foundation, and has been yanked from crates.io.
- Gate all exported primitives behind opt-in Cargo features and enable no features by default; downstream dependencies must explicitly enable the APIs they use.
- Raise the minimum supported Rust version from 1.85.0 to 1.86.0.
- Remove the
admissionmodule, includingFairShare,FairSharePermit, andOwnedFairSharePermit. - Remove the
asyncband::atomicboxmodule and itsAtomicBoxandAtomicOptionBoxtypes from the public API. - Remove the lossy
broadcast::overflowchannel; use the new losslessbroadcast::mpmc::unboundedchannel instead. - Remove
OnceMap::with_capacityandOnceMap::with_capacity_and_hasher; useOnceMap::neworOnceMap::with_hasher, which allocate the backing table lazily. - Remove the unconstructible
LatchWaitandOwnedLatchWaittypes from the public API;Latch::waitandLatch::wait_ownedcontinue to return anonymous futures through theirasync fnsignatures. - Rename
oneshot::Sender::is_closedandoneshot::Receiver::is_closedtois_disconnected. - Remove
Semaphore::try_acquire_and_forget,Semaphore::acquire_and_forget,Semaphore::try_acquire_owned_and_forget, andSemaphore::acquire_owned_and_forget; acquire a permit and call itsforgetmethod instead. - Replace
Semaphore::forgetwithSemaphore::drain_permitsandSemaphore::forget_exactwithSemaphore::reduce_permits; permit-levelforgetmethods are unchanged. - Redesign graceful shutdown: rename
ShutdownSendandShutdownRecvtoShutdownandShutdownGuard, andshutdown::new_pairtoshutdown::new; replaceShutdownSend::shutdownwithShutdown::request_shutdownandShutdownSend::await_shutdownwith awaitingShutdown; renameis_shutdown_now,is_shutdown, andis_shutdown_ownedtois_shutdown_requested,shutdown_requested, andshutdown_requested_owned; and addShutdownGuard::into_watch.
- Implement
broadcast::mpmc::unbounded, an unbounded broadcast channel that retains messages until all active receivers consume them or are dropped. - Add an opt-in clone-based latest-state channel under
asyncband::watch, including retained replacement updates throughSender::send_replace. - Add opt-in
asyncband::event::ManualResetEvent, a reusable level-triggered signal that releases registered waits and remains ready for future waits until explicitly reset. - Add an opt-in shared one-shot completion primitive under
asyncband::completionwith a single-use completer, cloneable observers, a retained borrowed result, and observable abandonment. - Add opt-in
asyncband::once::LazyCellfor values that own one asynchronous initializer and preserve its in-flight future across caller cancellation. - Add opt-in bounded and unbounded runtime-agnostic object pools under
asyncband::pool. - Add an opt-in
asyncband::blocking::FutureExtbridge withblock_onandwait_timeoutmethods for waiting on runtime-agnostic futures from synchronous code.
- Reject semaphore permit merges whose combined count exceeds
usize::MAXinstead of wrapping and losing permits. - Release cancelled wait registrations promptly and reclaim fulfilled
Semaphore::reduce_permitsdebt nodes. - Preserve fan-out notifications, including semaphore permit grants, when one registered waker panics.
- Reduce fan-out notification overhead by avoiding heap allocation for a single waiter and transferring terminal waiter storage out of state locks.
- Reduce MPSC receiver registration and wake latency by storing receiver wakers inline instead of allocating them on the heap.
- Reduce semaphore and mutex hot-path overhead by avoiding wake-buffer allocation when no tasks are queued and batching queued wakes on the stack.
- Allocate
OnceMapandsingleflight::Groupregistries lazily to reduce construction overhead. - Describe disconnected channel states consistently in channel error messages.
- Avoid fixed CPU spinning before registering
WaitGroup,Latch, andOncewaiters. - Specialize
WaitGroup's one-shot completion state to reduce handle registration and multi-waiter notification overhead while preserving cancellable multi-observer waits. - Reduce waiter state and notification overhead across
Barrier, broadcast, completion,Latch,Once, and watch by reusing each primitive's existing lifecycle state instead of maintaining duplicate waiter epochs.