directly write to file

This commit is contained in:
hal8174 2025-03-27 12:00:38 +01:00
parent a045570596
commit dc8afb0cac

View file

@ -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<perfetto::TracePacket>,
file: File,
spans: HashMap<u64, SpanInfo>,
threads: HashMap<ThreadId, u64>,
}
impl InnerPerfettoSubscriber {
fn new(buffer: Vec<perfetto::TracePacket>) -> 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();
}
}