feat(channel): recv_timeout - bounded receive on the WaitTimeout machinery
The per-recv deadline the roadmap deferred, built exactly the way Mutex::lock_timeout already works: register the wait with a per-wait seq, arm a timer::Reason::WaitTimeout with the channel inner (now a TimerTarget) as the target, park. On expiry on_timeout cancels the wait only if that same seq is still parked; satisfied or abandoned waits leave a stale heap entry that no-ops on seq mismatch, per the no-cancellation convention in timer.rs. Race resolution is message-first: a send that lands by the time the woken receiver runs is delivered even if the deadline had also passed. Closure is reported as RecvTimeoutError::Disconnected, keeping timeout and server/sender death distinguishable for callers (gen_server call timeout builds on exactly this distinction next). The timer is armed outside the channel critical section (the timers lock must never nest under a Channel-class lock); the unpark race this opens is absorbed by the RunningNotified protocol. Tests: immediate delivery, actual timeout (with elapsed check), prompt wake on send, Disconnected on close, zero-duration poll, post-timeout seq isolation (stale entry must not cancel later waits), and a 4-scheduler mixed-outcome run (12 fed / 12 timed out).
This commit is contained in:
+1
-1
@@ -45,7 +45,7 @@ static ALLOCATOR: preempt::PreemptingAllocator = preempt::PreemptingAllocator;
|
||||
// Public API re-exports
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
pub use channel::{channel, Receiver, RecvError, Sender};
|
||||
pub use channel::{channel, Receiver, RecvError, RecvTimeoutError, Sender};
|
||||
pub use gen_server::{CallError, CastError, GenServer, ServerRef};
|
||||
pub use link::{link, trap_exit, unlink, ExitSignal};
|
||||
pub use monitor::{demonitor, monitor, Down, DownReason, Monitor, MonitorId};
|
||||
|
||||
Reference in New Issue
Block a user