prns_runtime/manifold/kernel/
wake_schedule.rs1use crate::engine::{EngineReaction, EngineState, InstantMillis, WakeReason, WakeSchedules};
2use crate::interfaces::AttachedInterfaces;
3use crate::storage::StorageLayout;
4
5pub fn fire_due_reason<S, F>(
6 engine: &mut EngineState<S>,
7 reason: WakeReason,
8 now: InstantMillis,
9 interfaces: AttachedInterfaces<'_>,
10 fill_entropy: &mut F,
11 on_reaction: &mut impl FnMut(EngineReaction<'_>),
12) -> WakeSchedules
13where
14 S: StorageLayout,
15 F: FnMut(&mut [u8]),
16{
17 match reason {
18 WakeReason::ScheduledAnnounces => {
19 engine.fire_due_scheduled_announces(now, interfaces, on_reaction)
20 }
21 WakeReason::ReceiptTimeouts => engine.settle_timed_out_receipts(now, on_reaction),
22 WakeReason::PathRequestTimeouts => engine.settle_timed_out_path_requests(now, on_reaction),
23 WakeReason::ExpiredRoutes => engine.cull_expired_routes(now, interfaces, on_reaction),
24 WakeReason::ExpiredDestinationIdentities => engine.cull_expired_destination_identities(now),
25 WakeReason::ExpiredBlackholes => engine.cull_expired_blackholes(now),
26 WakeReason::LinkDeadlines => {
27 engine.fire_due_link_deadlines(now, interfaces, fill_entropy, on_reaction)
28 }
29 WakeReason::ResourceDeadlines => {
30 engine.fire_due_resource_deadlines(now, fill_entropy, on_reaction)
31 }
32 WakeReason::ChannelTimeouts => {
33 engine.fire_due_channel_timeouts(now, interfaces, fill_entropy, on_reaction)
34 }
35 WakeReason::HeldAnnounceRelease => {
36 engine.fire_due_held_announces(now, interfaces, fill_entropy, on_reaction)
37 }
38 }
39}
40
41pub fn merge_wake_schedules_delta<S: StorageLayout>(
42 source_wake_schedules: &mut WakeSchedules,
43 delta: WakeSchedules,
44 engine: &EngineState<S>,
45 interfaces: AttachedInterfaces<'_>,
46) {
47 source_wake_schedules.merge(delta);
48 #[cfg(debug_assertions)]
49 {
50 let truth = engine.wake_schedules(interfaces);
51 debug_assert_eq!(
52 source_wake_schedules.scheduled_announces, truth.scheduled_announces,
53 "the scheduled-announces schedule drifted from a full recompute",
54 );
55 debug_assert_eq!(
56 source_wake_schedules.receipt_timeouts, truth.receipt_timeouts,
57 "the receipt-timeouts schedule drifted from a full recompute",
58 );
59 debug_assert_eq!(
60 source_wake_schedules.path_request_timeouts, truth.path_request_timeouts,
61 "the path-request-timeouts schedule drifted from a full recompute",
62 );
63 debug_assert!(
64 never_late(source_wake_schedules.link_deadlines, truth.link_deadlines),
65 "the link-deadlines schedule must never sit later than the truth: cached {:?}, truth {:?}",
66 source_wake_schedules.link_deadlines,
67 truth.link_deadlines,
68 );
69 debug_assert_eq!(
70 source_wake_schedules.resource_deadlines, truth.resource_deadlines,
71 "the resource-deadlines schedule drifted from a full recompute",
72 );
73 debug_assert_eq!(
74 source_wake_schedules.channel_timeouts, truth.channel_timeouts,
75 "the channel-timeouts schedule drifted from a full recompute",
76 );
77 debug_assert!(
78 never_late(source_wake_schedules.expired_routes, truth.expired_routes),
79 "the expired-routes schedule must never sit later than the truth: cached {:?}, truth {:?}",
80 source_wake_schedules.expired_routes,
81 truth.expired_routes,
82 );
83 debug_assert!(
84 never_late(
85 source_wake_schedules.expired_destination_identities,
86 truth.expired_destination_identities,
87 ),
88 "the expired-destination-identities schedule must never sit later than the truth: cached {:?}, truth {:?}",
89 source_wake_schedules.expired_destination_identities,
90 truth.expired_destination_identities,
91 );
92 debug_assert_eq!(
93 source_wake_schedules.expired_blackholes, truth.expired_blackholes,
94 "the expired-blackholes schedule drifted from a full recompute",
95 );
96 debug_assert_eq!(
97 source_wake_schedules.held_announce_release, truth.held_announce_release,
98 "the held-announce-release schedule drifted from a full recompute",
99 );
100 }
101 #[cfg(not(debug_assertions))]
102 let _ = (engine, interfaces);
103}
104
105#[cfg(debug_assertions)]
106fn never_late(cached: crate::engine::WakeSchedule, truth: crate::engine::WakeSchedule) -> bool {
107 use crate::engine::WakeSchedule::{At, Idle};
108 match (cached, truth) {
109 (At(cached_at), At(truth_at)) => cached_at <= truth_at,
110 (At(_), Idle) => true,
111 (Idle, Idle) => true,
112 _ => cached == truth,
113 }
114}