Skip to main content

fret_runtime/
runner_surface_lifecycle_diagnostics.rs

1use fret_core::time::{SystemTime, UNIX_EPOCH};
2
3/// Diagnostics store for runner surface lifecycle transitions.
4///
5/// This is intended to help mobile bring-up verify that winit lifecycle hooks are firing and that
6/// surfaces are dropped/recreated as expected on background/foreground transitions.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
8pub struct RunnerSurfaceLifecycleSnapshot {
9    pub can_create_surfaces_calls: u64,
10    pub destroy_surfaces_calls: u64,
11    pub last_can_create_surfaces_unix_ms: Option<u64>,
12    pub last_destroy_surfaces_unix_ms: Option<u64>,
13    pub surfaces_available: bool,
14}
15
16#[derive(Debug, Default)]
17pub struct RunnerSurfaceLifecycleDiagnosticsStore {
18    snapshot: RunnerSurfaceLifecycleSnapshot,
19}
20
21impl RunnerSurfaceLifecycleDiagnosticsStore {
22    pub fn snapshot(&self) -> RunnerSurfaceLifecycleSnapshot {
23        self.snapshot
24    }
25
26    pub fn record_can_create_surfaces(&mut self) {
27        self.snapshot.can_create_surfaces_calls =
28            self.snapshot.can_create_surfaces_calls.saturating_add(1);
29        self.snapshot.last_can_create_surfaces_unix_ms = Some(unix_ms_now());
30        self.snapshot.surfaces_available = true;
31    }
32
33    pub fn record_destroy_surfaces(&mut self) {
34        self.snapshot.destroy_surfaces_calls =
35            self.snapshot.destroy_surfaces_calls.saturating_add(1);
36        self.snapshot.last_destroy_surfaces_unix_ms = Some(unix_ms_now());
37        self.snapshot.surfaces_available = false;
38    }
39}
40
41fn unix_ms_now() -> u64 {
42    SystemTime::now()
43        .duration_since(UNIX_EPOCH)
44        .map(|d| d.as_millis() as u64)
45        .unwrap_or(0)
46}