eventbus-tiny

Crates.ioeventbus-tiny
lib.rseventbus-tiny
version
sourcesrc
created_at2025-02-07 18:18:13.318215+00
updated_at2025-02-07 18:18:13.318215+00
descriptionA small, dependency-free crate that provides a multi-producer broadcast-consumer event bus
homepage
repositoryhttps://github.com/KizzyCode/eventbus-tiny-rust
max_upload_size
id1547281
Cargo.toml error:TOML parse error at line 18, column 1 | 18 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include`
size0
Keziah Biermann (KizzyCode)

documentation

README

License BSD-2-Clause License MIT AppVeyor CI docs.rs crates.io Download numbers dependency status

eventbus-tiny

Welcome to eventbus-tiny 🎉

eventbus-tiny is a small, dependency-free, no-unsafe crate that provides a multi-producer broadcast-consumer event bus for arbitrary event types (as long as they are Send).

Implementation and Locking

The implementation nearly lock-free, only requiring a write-lock if the registry changes (i.e. if a new subscriber is added, or shrink_to_fit is called) - everything else uses either a cooperative read-lock, or is completely lockfree via the underlying [std::sync::mpsc]-channels.

This approach provides a reasonable compromise between ease-of-implementation (no dependencies, no unsafe code, well-known semantics of built-in types), and performance with lock-free operation in all critical hot-zones like event publication and awaiting/receiving events.

Example

use eventbus_tiny::EventBus;
use eventbus_tiny::Subscription;

// Create bus and subscribers
let bus = EventBus::new();
let subscriber_a: Subscription<usize> = bus.subscribe(64);
let subscriber_b: Subscription<usize> = bus.subscribe(64);

// Publish some events and ensure they get delivered to all two subscribers
assert_eq!(bus.publish(1usize), 2);
assert_eq!(bus.publish(4usize), 2);
assert_eq!(bus.publish(7usize), 2);

// Receive events
assert_eq!(subscriber_a.recv(), Ok(1usize));
assert_eq!(subscriber_a.recv(), Ok(4usize));
assert_eq!(subscriber_a.recv(), Ok(7usize));

assert_eq!(subscriber_b.recv(), Ok(1usize));
assert_eq!(subscriber_b.recv(), Ok(4usize));
assert_eq!(subscriber_b.recv(), Ok(7usize));

// Drop bus and assert the subscribers are dead
drop(bus);
assert!(subscriber_a.recv().is_err());
assert!(subscriber_b.recv().is_err());
Commit count: 4

cargo fmt