Skip to main content

prns_runtime/manifold/kernel/
wake_schedule.rs

1use 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}