feat(causal): wall-anchored send_after — user-facing timer opt-out (RFC 007)
send_after_wall / send_after_named_wall (+ Timers::insert_send_wall) arm a
message-delivery timer that opts out of the RFC 007 virtual-time shift and
fires at its raw deadline regardless of injected delay — the Send-reason
sibling of sleep_wall, closing the jar item whose substrate efbc254 landed.
For deadlines that reflect the outside world (protocol timeouts, wall-clock
schedules) rather than workload pacing. cancel_timer is anchor-agnostic and
unchanged; without the feature the API exists and is identical to send_after.
The gen_server timer layer (send_after_to, RFC 015 §5) deliberately stays
virtual-only — an opt-out there means new options on the gen_server/statem
timeout API, out of scope for now.
Tests: wall send fires at raw deadline while a virtual sibling shifts;
cancel on a wall send with debt outstanding; featureless delivery/cancel
smokes through the public named API. 15/15 causal, 34/34 binaries both
feature configs, lib clippy clean both.
This commit is contained in:
@@ -193,6 +193,22 @@ impl Timers {
|
||||
TimerId(self.push(deadline, pid, Reason::Send { fire }, false))
|
||||
}
|
||||
|
||||
/// Arm a *wall-anchored* cancellable `send_after` timer (RFC 007): the
|
||||
/// same contract as [`insert_send`](Self::insert_send), but the entry
|
||||
/// opts out of the virtual-time shift and fires at its raw deadline
|
||||
/// regardless of injected delay — the `Send`-reason sibling of
|
||||
/// [`insert_sleep_wall`](Self::insert_sleep_wall). Without the
|
||||
/// `smarm-causal` feature this is identical to `insert_send`.
|
||||
pub fn insert_send_wall(
|
||||
&mut self,
|
||||
deadline: Instant,
|
||||
pid: Pid,
|
||||
fire: Box<dyn FnOnce() + Send>,
|
||||
) -> TimerId {
|
||||
self.armed.insert(self.next_seq);
|
||||
TimerId(self.push(deadline, pid, Reason::Send { fire }, true))
|
||||
}
|
||||
|
||||
/// Cancel an armed `send_after` timer. Returns `true` if the timer was
|
||||
/// still armed (delivery is now prevented), `false` if it had already
|
||||
/// fired or been cancelled. The heap entry, if still pending, is left to be
|
||||
|
||||
Reference in New Issue
Block a user