directly write to file
This commit is contained in:
parent
a045570596
commit
dc8afb0cac
1 changed files with 16 additions and 17 deletions
33
src/lib.rs
33
src/lib.rs
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue