Crates.io | eventbus-tiny |
lib.rs | eventbus-tiny |
version | |
source | src |
created_at | 2025-02-07 18:18:13.318215+00 |
updated_at | 2025-02-07 18:18:13.318215+00 |
description | A small, dependency-free crate that provides a multi-producer broadcast-consumer event bus |
homepage | |
repository | https://github.com/KizzyCode/eventbus-tiny-rust |
max_upload_size | |
id | 1547281 |
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` |
size | 0 |
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
).
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.
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());