tinymist_vfs/
trace.rs

1use std::sync::atomic::AtomicU64;
2
3use tinymist_std::ImmutPath;
4use typst::diag::FileResult;
5
6use crate::{AccessModel, Bytes, TypstFileId};
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    pub inner: M,
15    trace: [AtomicU64; 6],
16}
17
18impl<M: AccessModel + Sized> TraceAccessModel<M> {
19    /// Create a new [`TraceAccessModel`] with the given inner access model
20    pub fn new(inner: M) -> Self {
21        Self {
22            inner,
23            trace: Default::default(),
24        }
25    }
26}
27
28impl<M: AccessModel + Sized> AccessModel for TraceAccessModel<M> {
29    #[inline]
30    fn reset(&mut self) {
31        self.inner.reset();
32    }
33
34    fn content(&self, src: TypstFileId) -> (Option<ImmutPath>, FileResult<Bytes>) {
35        let instant = tinymist_std::time::Instant::now();
36        let res = self.inner.content(src);
37        let elapsed = instant.elapsed();
38        self.trace[3].fetch_add(
39            elapsed.as_nanos() as u64,
40            std::sync::atomic::Ordering::Relaxed,
41        );
42        crate::utils::console_log!("read_all: {:?} {:?}", src, elapsed);
43        res
44    }
45}