tinymist_vfs/
trace.rs

1use std::sync::atomic::AtomicU64;
2
3use tinymist_std::ImmutPath;
4use typst::diag::FileResult;
5
6use crate::{AccessModel, Bytes, FileId};
7
8/// Provides trace access model which traces the underlying access model.
9///
10/// It simply wraps the underlying access model and prints all the access to the
11/// stdout or the browser console.
12#[derive(Debug)]
13pub struct TraceAccessModel<M: AccessModel + Sized> {
14    trace: [AtomicU64; 6],
15    /// The inner access model
16    pub inner: M,
17}
18
19impl<M: AccessModel + Sized> TraceAccessModel<M> {
20    /// Create a new [`TraceAccessModel`] with the given inner access model
21    pub fn new(inner: M) -> Self {
22        Self {
23            inner,
24            trace: Default::default(),
25        }
26    }
27}
28
29impl<M: AccessModel + Sized> AccessModel for TraceAccessModel<M> {
30    #[inline]
31    fn reset(&mut self) {
32        self.inner.reset();
33    }
34
35    fn content(&self, src: FileId) -> (Option<ImmutPath>, FileResult<Bytes>) {
36        let instant = tinymist_std::time::Instant::now();
37        let res = self.inner.content(src);
38        let elapsed = instant.elapsed();
39        self.trace[3].fetch_add(
40            elapsed.as_nanos() as u64,
41            std::sync::atomic::Ordering::Relaxed,
42        );
43        crate::utils::console_log!("read_all: {:?} {:?}", src, elapsed);
44        res
45    }
46}