telepath_server/
profile.rs1#[cfg(target_has_atomic = "64")]
20use core::sync::atomic::{AtomicU32, AtomicU64, Ordering};
21#[cfg(not(target_has_atomic = "64"))]
22use portable_atomic::{AtomicU32, AtomicU64, Ordering};
23
24use telepath_wire::MetricsSnapshot;
25
26pub(crate) static ENCODE_CYCLES: AtomicU64 = AtomicU64::new(0);
27pub(crate) static DECODE_CYCLES: AtomicU64 = AtomicU64::new(0);
28pub(crate) static ENCODED_BYTES: AtomicU32 = AtomicU32::new(0);
29pub(crate) static DECODED_BYTES: AtomicU32 = AtomicU32::new(0);
30pub(crate) static SAMPLE_COUNT: AtomicU32 = AtomicU32::new(0);
31
32pub fn init_dwt() {
48 #[cfg(target_arch = "arm")]
49 unsafe {
50 let mut cp = cortex_m::peripheral::Peripherals::steal();
51 cp.DCB.enable_trace();
52 cortex_m::peripheral::DWT::unlock();
53 cp.DWT.enable_cycle_counter();
54 cp.DWT.cyccnt.write(0);
55 }
56}
57
58#[inline(always)]
61pub fn cycles_now() -> u32 {
62 #[cfg(target_arch = "arm")]
63 {
64 cortex_m::peripheral::DWT::cycle_count()
65 }
66 #[cfg(not(target_arch = "arm"))]
67 {
68 0
69 }
70}
71
72pub fn snapshot_and_reset() -> MetricsSnapshot {
74 MetricsSnapshot {
75 encode_cycles: ENCODE_CYCLES.swap(0, Ordering::Relaxed),
76 decode_cycles: DECODE_CYCLES.swap(0, Ordering::Relaxed),
77 encoded_bytes: ENCODED_BYTES.swap(0, Ordering::Relaxed),
78 decoded_bytes: DECODED_BYTES.swap(0, Ordering::Relaxed),
79 sample_count: SAMPLE_COUNT.swap(0, Ordering::Relaxed),
80 }
81}
82
83fn get_metrics_shim(
95 input: &[u8],
96 output: &mut [u8],
97 _resources: &crate::ResourceRegistry,
98) -> Result<crate::DispatchOutcome, crate::DispatchError> {
99 if !input.is_empty() {
100 return Err(crate::DispatchError::DeserializeError);
101 }
102 let snap = snapshot_and_reset();
103 postcard::to_slice(&snap, output)
104 .map(|s| crate::DispatchOutcome::Ok(s.len()))
105 .map_err(|_| crate::DispatchError::SerializeError)
106}
107
108fn get_metrics_args_schema(out: &mut [u8]) -> Result<usize, ()> {
109 postcard::to_slice(<() as crate::__postcard_schema::Schema>::SCHEMA, out)
110 .map(|s| s.len())
111 .map_err(|_| ())
112}
113
114fn get_metrics_ret_schema(out: &mut [u8]) -> Result<usize, ()> {
115 postcard::to_slice(
116 <MetricsSnapshot as crate::__postcard_schema::Schema>::SCHEMA,
117 out,
118 )
119 .map(|s| s.len())
120 .map_err(|_| ())
121}
122
123pub const GET_METRICS_CMD: crate::CommandMetadata = crate::CommandMetadata {
124 name: "get_metrics",
125 id: telepath_wire::CMD_ID_METRICS,
126 invoke: get_metrics_shim,
127 args_schema: get_metrics_args_schema,
128 ret_schema: get_metrics_ret_schema,
129 arg_names: "",
130};
131
132#[allow(non_upper_case_globals, non_snake_case)]
133#[crate::__linkme::distributed_slice(crate::TELEPATH_COMMANDS)]
134#[linkme(crate = crate::__linkme)]
135static __TELEPATH_REG_GET_METRICS: crate::CommandMetadata = GET_METRICS_CMD;