diff --git a/src/lib.rs b/src/lib.rs index b36af3a..77f4d22 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ use std::{ collections::HashMap, + fs::File, io::Write, sync::{Mutex, atomic::AtomicU64}, thread::ThreadId, @@ -33,15 +34,25 @@ struct SpanInfo { } struct InnerPerfettoSubscriber { - buffer: Vec, + file: File, spans: HashMap, threads: HashMap, } impl InnerPerfettoSubscriber { fn new(buffer: Vec) -> Self { + let mut file = File::options() + .write(true) + .create(true) + .truncate(true) + .open("out.trace") + .unwrap(); + + let trace = perfetto::Trace { packet: buffer }; + + file.write(&trace.encode_to_vec()).unwrap(); Self { - buffer, + file, spans: HashMap::new(), threads: HashMap::new(), } @@ -55,7 +66,7 @@ impl InnerPerfettoSubscriber { std::collections::hash_map::Entry::Vacant(vacant_entry) => { vacant_entry.insert(nextfree); - self.buffer.push(perfetto::TracePacket { + self.push(perfetto::TracePacket { timestamp: None, data: Some(perfetto::trace_packet::Data::TrackDescriptor( perfetto::TrackDescriptor { @@ -83,23 +94,11 @@ impl InnerPerfettoSubscriber { } fn push(&mut self, packet: perfetto::TracePacket) { - self.buffer.push(packet); - - self.flush(); - } - - fn flush(&mut self) { let trace = perfetto::Trace { - packet: std::mem::take(&mut self.buffer), + packet: vec![packet], }; - let buf = trace.encode_to_vec(); - let mut file = std::fs::File::options() - .append(true) - .open("out.trace") - .unwrap(); - - let _ = file.write(&buf); + self.file.write(&trace.encode_to_vec()).unwrap(); } }