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::{ use std::{
collections::HashMap, collections::HashMap,
fs::File,
io::Write, io::Write,
sync::{Mutex, atomic::AtomicU64}, sync::{Mutex, atomic::AtomicU64},
thread::ThreadId, thread::ThreadId,
@ -33,15 +34,25 @@ struct SpanInfo {
} }
struct InnerPerfettoSubscriber { struct InnerPerfettoSubscriber {
buffer: Vec<perfetto::TracePacket>, file: File,
spans: HashMap<u64, SpanInfo>, spans: HashMap<u64, SpanInfo>,
threads: HashMap<ThreadId, u64>, threads: HashMap<ThreadId, u64>,
} }
impl InnerPerfettoSubscriber { impl InnerPerfettoSubscriber {
fn new(buffer: Vec<perfetto::TracePacket>) -> Self { 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 { Self {
buffer, file,
spans: HashMap::new(), spans: HashMap::new(),
threads: HashMap::new(), threads: HashMap::new(),
} }
@ -55,7 +66,7 @@ impl InnerPerfettoSubscriber {
std::collections::hash_map::Entry::Vacant(vacant_entry) => { std::collections::hash_map::Entry::Vacant(vacant_entry) => {
vacant_entry.insert(nextfree); vacant_entry.insert(nextfree);
self.buffer.push(perfetto::TracePacket { self.push(perfetto::TracePacket {
timestamp: None, timestamp: None,
data: Some(perfetto::trace_packet::Data::TrackDescriptor( data: Some(perfetto::trace_packet::Data::TrackDescriptor(
perfetto::TrackDescriptor { perfetto::TrackDescriptor {
@ -83,23 +94,11 @@ impl InnerPerfettoSubscriber {
} }
fn push(&mut self, packet: perfetto::TracePacket) { fn push(&mut self, packet: perfetto::TracePacket) {
self.buffer.push(packet);
self.flush();
}
fn flush(&mut self) {
let trace = perfetto::Trace { 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() self.file.write(&trace.encode_to_vec()).unwrap();
.append(true)
.open("out.trace")
.unwrap();
let _ = file.write(&buf);
} }
} }