@@ -4,7 +4,8 @@ use std::{
44 path:: PathBuf ,
55} ;
66
7- use ruzstd:: encoding:: { CompressionLevel , compress} ;
7+ #[ cfg( target_arch = "x86_64" ) ]
8+ use zeekstd:: Encoder ;
89
910use crate :: {
1011 TraceLowLevelEvent ,
@@ -20,28 +21,26 @@ pub const HEADERV1: &[u8] = &[
2021 0x00 , 0x00 ,
2122] ; // Reserved, must be zero in this version.
2223
23- pub struct CborZstdTraceWriter {
24+ pub struct CborZstdTraceWriter < ' a > {
2425 base : AbstractTraceWriterData ,
2526
2627 trace_events_path : Option < PathBuf > ,
27- trace_events_file : Option < File > ,
28- uncompressed_buf : Vec < u8 > ,
28+ trace_events_file_zstd_encoder : Option < Encoder < ' a , File > > ,
2929}
3030
31- impl CborZstdTraceWriter {
31+ impl CborZstdTraceWriter < ' _ > {
3232 /// Create a new tracer instance for the given program and arguments.
3333 pub fn new ( program : & str , args : & [ String ] ) -> Self {
3434 CborZstdTraceWriter {
3535 base : AbstractTraceWriterData :: new ( program, args) ,
3636
3737 trace_events_path : None ,
38- trace_events_file : None ,
39- uncompressed_buf : Vec :: new ( ) ,
38+ trace_events_file_zstd_encoder : None ,
4039 }
4140 }
4241}
4342
44- impl AbstractTraceWriter for CborZstdTraceWriter {
43+ impl AbstractTraceWriter for CborZstdTraceWriter < ' _ > {
4544 fn get_data ( & self ) -> & AbstractTraceWriterData {
4645 & self . base
4746 }
@@ -52,37 +51,35 @@ impl AbstractTraceWriter for CborZstdTraceWriter {
5251
5352 fn add_event ( & mut self , event : TraceLowLevelEvent ) {
5453 let buf: Vec < u8 > = Vec :: new ( ) ;
55- let q = cbor4ii:: serde:: to_vec ( buf, & event) . expect ( "CBOR encode failed" ) ;
56- self . uncompressed_buf . extend_from_slice ( & q) ;
54+ let q = cbor4ii:: serde:: to_vec ( buf, & event) . unwrap ( ) ;
55+ if let Some ( enc) = & mut self . trace_events_file_zstd_encoder {
56+ enc. write_all ( & q) . unwrap ( ) ;
57+ }
5758 }
5859
5960 fn append_events ( & mut self , events : & mut Vec < TraceLowLevelEvent > ) {
60- for e in events. drain ( .. ) {
61- < Self as AbstractTraceWriter > :: add_event ( self , e) ;
61+ for e in events {
62+ AbstractTraceWriter :: add_event ( self , e. clone ( ) ) ;
6263 }
6364 }
6465}
6566
66- impl TraceWriter for CborZstdTraceWriter {
67+ #[ cfg( target_arch = "x86_64" ) ]
68+ impl TraceWriter for CborZstdTraceWriter < ' _ > {
6769 fn begin_writing_trace_events ( & mut self , path : & std:: path:: Path ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
6870 let pb = path. to_path_buf ( ) ;
6971 self . trace_events_path = Some ( pb. clone ( ) ) ;
70-
7172 let mut file_output = std:: fs:: File :: create ( pb) ?;
7273 file_output. write_all ( HEADERV1 ) ?;
73- self . trace_events_file = Some ( file_output) ;
74+ self . trace_events_file_zstd_encoder = Some ( Encoder :: new ( file_output) ? ) ;
7475
7576 Ok ( ( ) )
7677 }
7778
7879 fn finish_writing_trace_events ( & mut self ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
79- if let Some ( mut file) = self . trace_events_file . take ( ) {
80- let mut cursor = Cursor :: new ( & self . uncompressed_buf ) ;
81- compress ( & mut cursor, & mut file, CompressionLevel :: Fastest ) ;
82-
83- file. flush ( ) ?;
80+ if let Some ( enc) = self . trace_events_file_zstd_encoder . take ( ) {
81+ enc. finish ( ) ?;
8482
85- self . uncompressed_buf . clear ( ) ;
8683 Ok ( ( ) )
8784 } else {
8885 panic ! ( "finish_writing_trace_events() called without previous call to begin_writing_trace_events()" ) ;
0 commit comments