1use std::sync::atomic::AtomicU64;
2
3use tinymist_std::ImmutPath;
4use typst::diag::FileResult;
5
6use crate::{AccessModel, Bytes, FileId};
7
8#[derive(Debug)]
13pub struct TraceAccessModel<M: AccessModel + Sized> {
14 trace: [AtomicU64; 6],
15 pub inner: M,
17}
18
19impl<M: AccessModel + Sized> TraceAccessModel<M> {
20 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}