@@ -4,7 +4,7 @@ use std::{
44 path:: PathBuf ,
55} ;
66
7- use ruzstd :: encoding :: { CompressionLevel , compress } ;
7+ use zeekstd :: Encoder ;
88
99use crate :: {
1010 TraceLowLevelEvent ,
@@ -20,28 +20,26 @@ pub const HEADERV1: &[u8] = &[
2020 0x00 , 0x00 ,
2121] ; // Reserved, must be zero in this version.
2222
23- pub struct CborZstdTraceWriter {
23+ pub struct CborZstdTraceWriter < ' a > {
2424 base : AbstractTraceWriterData ,
2525
2626 trace_events_path : Option < PathBuf > ,
27- trace_events_file : Option < File > ,
28- uncompressed_buf : Vec < u8 > ,
27+ trace_events_file_zstd_encoder : Option < Encoder < ' a , File > > ,
2928}
3029
31- impl CborZstdTraceWriter {
30+ impl CborZstdTraceWriter < ' _ > {
3231 /// Create a new tracer instance for the given program and arguments.
3332 pub fn new ( program : & str , args : & [ String ] ) -> Self {
3433 CborZstdTraceWriter {
3534 base : AbstractTraceWriterData :: new ( program, args) ,
3635
3736 trace_events_path : None ,
38- trace_events_file : None ,
39- uncompressed_buf : Vec :: new ( ) ,
37+ trace_events_file_zstd_encoder : None ,
4038 }
4139 }
4240}
4341
44- impl AbstractTraceWriter for CborZstdTraceWriter {
42+ impl AbstractTraceWriter for CborZstdTraceWriter < ' _ > {
4543 fn get_data ( & self ) -> & AbstractTraceWriterData {
4644 & self . base
4745 }
@@ -52,37 +50,34 @@ impl AbstractTraceWriter for CborZstdTraceWriter {
5250
5351 fn add_event ( & mut self , event : TraceLowLevelEvent ) {
5452 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) ;
53+ let q = cbor4ii:: serde:: to_vec ( buf, & event) . unwrap ( ) ;
54+ if let Some ( enc) = & mut self . trace_events_file_zstd_encoder {
55+ enc. write_all ( & q) . unwrap ( ) ;
56+ }
5757 }
5858
5959 fn append_events ( & mut self , events : & mut Vec < TraceLowLevelEvent > ) {
60- for e in events. drain ( .. ) {
61- < Self as AbstractTraceWriter > :: add_event ( self , e) ;
60+ for e in events {
61+ AbstractTraceWriter :: add_event ( self , e. clone ( ) ) ;
6262 }
6363 }
6464}
6565
66- impl TraceWriter for CborZstdTraceWriter {
66+ impl TraceWriter for CborZstdTraceWriter < ' _ > {
6767 fn begin_writing_trace_events ( & mut self , path : & std:: path:: Path ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
6868 let pb = path. to_path_buf ( ) ;
6969 self . trace_events_path = Some ( pb. clone ( ) ) ;
70-
7170 let mut file_output = std:: fs:: File :: create ( pb) ?;
7271 file_output. write_all ( HEADERV1 ) ?;
73- self . trace_events_file = Some ( file_output) ;
72+ self . trace_events_file_zstd_encoder = Some ( Encoder :: new ( file_output) ? ) ;
7473
7574 Ok ( ( ) )
7675 }
7776
7877 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 ( ) ?;
78+ if let Some ( enc) = self . trace_events_file_zstd_encoder . take ( ) {
79+ enc. finish ( ) ?;
8480
85- self . uncompressed_buf . clear ( ) ;
8681 Ok ( ( ) )
8782 } else {
8883 panic ! ( "finish_writing_trace_events() called without previous call to begin_writing_trace_events()" ) ;
0 commit comments