feat(registry): named pid registry as a bimap
register/whereis/unregister plus the inverse lookup name_of. Erlang semantics: one name per pid, one pid per name, registering over a live binding errors; same-binding re-register is an idempotent Ok. Bimap = two HashMaps held in exact inverse under one Leaf RawMutex in RuntimeInner; the invariant is debug-asserted on every mutation. The inverse direction costs one extra String per binding and buys O(1) pid->name for supervisors/tracing/diagnostics. Cleanup is lazy: no finalize_actor hook, no Slot field (which would buy into the reset-in-three-places invariant). Liveness rides the generation-checked slot word - pids are never reused, so a stale binding is detectable, never misdirected - and bindings to dead actors behave as absent, pruned on contact by whereis/name_of/register/unregister. Liveness checks under the registry lock read only the atomic slot word, so the leaf rule holds trivially. send_by_name is deliberately absent: smarm has no per-pid mailbox, so there is nothing generic to send *to* - the registry yields a Pid, usable with monitor/link/request_stop and as routing for user channels. Tests: roundtrip both directions, idempotence, NameTaken on live holder, one-name-per-pid, NoProc, death-evaporates-binding (via lookup pruning and via register's own eviction path), unregister, cross-actor lookup wired into request_stop, and a 4-scheduler name-contention churn test.
This commit is contained in:
@@ -23,6 +23,7 @@ pub mod timer;
|
||||
pub mod io;
|
||||
pub mod mutex;
|
||||
pub mod monitor;
|
||||
pub mod registry;
|
||||
pub mod link;
|
||||
pub mod gen_server;
|
||||
pub mod runtime;
|
||||
@@ -50,6 +51,7 @@ pub use link::{link, trap_exit, unlink, ExitSignal};
|
||||
pub use monitor::{demonitor, monitor, Down, DownReason, Monitor, MonitorId};
|
||||
pub use mutex::{LockTimeout, Mutex, MutexGuard};
|
||||
pub use pid::Pid;
|
||||
pub use registry::{name_of, register, unregister, whereis, RegisterError};
|
||||
pub use runtime::{init, Config, Runtime};
|
||||
pub use scheduler::{
|
||||
block_on_io, request_stop, run, self_pid, sleep, spawn, spawn_under, wait_readable,
|
||||
|
||||
Reference in New Issue
Block a user