@@ -30,7 +30,7 @@ use crate::{
3030/// Trace of `block_id`s met at runtime
3131static DRCOV_IDS : Mutex < Option < Vec < u64 > > > = Mutex :: new ( None ) ;
3232
33- ///Map of `pc` -> `block_id`
33+ /// Map of `pc` -> `block_id`
3434static DRCOV_MAP : Mutex < Option < HashMap < GuestAddr , u64 > > > = Mutex :: new ( None ) ;
3535
3636/// Map of `pc` -> `block_len`
@@ -60,6 +60,7 @@ pub struct DrCovModuleBuilder<F> {
6060 module_mapping : Option < RangeMap < u64 , ( u16 , String ) > > ,
6161 path : Option < PathBuf > ,
6262 full_trace : bool ,
63+ clean_on_flush : bool ,
6364}
6465
6566impl < F > DrCovModuleBuilder < F >
7273 self . path . unwrap ( ) ,
7374 self . module_mapping ,
7475 self . full_trace ,
76+ self . clean_on_flush ,
7577 )
7678 }
7779
8183 module_mapping : self . module_mapping ,
8284 path : self . path ,
8385 full_trace : self . full_trace ,
86+ clean_on_flush : self . clean_on_flush ,
8487 }
8588 }
8689
9194 module_mapping : Some ( module_mapping) ,
9295 path : self . path ,
9396 full_trace : self . full_trace ,
97+ clean_on_flush : self . clean_on_flush ,
9498 }
9599 }
96100
@@ -101,6 +105,7 @@ where
101105 module_mapping : self . module_mapping ,
102106 path : Some ( path. into ( ) ) ,
103107 full_trace : self . full_trace ,
108+ clean_on_flush : self . clean_on_flush ,
104109 }
105110 }
106111
@@ -111,6 +116,19 @@ where
111116 module_mapping : self . module_mapping ,
112117 path : self . path ,
113118 full_trace,
119+ clean_on_flush : self . clean_on_flush ,
120+ }
121+ }
122+
123+ /// Clean trace history of `block_id`s met at runtime every time after flushing to a file.
124+ #[ must_use]
125+ pub fn clean_on_flush ( self , clean_on_flush : bool ) -> Self {
126+ Self {
127+ filter : self . filter ,
128+ module_mapping : self . module_mapping ,
129+ path : self . path ,
130+ full_trace : true ,
131+ clean_on_flush,
114132 }
115133 }
116134}
@@ -121,6 +139,7 @@ pub struct DrCovModule<F> {
121139 module_mapping : Option < RangeMap < u64 , ( u16 , String ) > > ,
122140 path : PathBuf ,
123141 full_trace : bool ,
142+ clean_on_flush : bool ,
124143 drcov_len : usize ,
125144}
126145
@@ -379,6 +398,7 @@ impl DrCovModule<NopAddressFilter> {
379398 filter : Some ( NopAddressFilter ) ,
380399 module_mapping : None ,
381400 full_trace : false ,
401+ clean_on_flush : false ,
382402 path : None ,
383403 }
384404 }
@@ -391,6 +411,7 @@ impl<F> DrCovModule<F> {
391411 path : P ,
392412 module_mapping : Option < RangeMap < u64 , ( u16 , String ) > > ,
393413 full_trace : bool ,
414+ clean_on_flush : bool ,
394415 ) -> Self {
395416 if full_trace {
396417 * DRCOV_IDS . lock ( ) . unwrap ( ) = Some ( vec ! [ ] ) ;
@@ -404,6 +425,7 @@ impl<F> DrCovModule<F> {
404425 module_mapping,
405426 path : path. into ( ) ,
406427 full_trace,
428+ clean_on_flush,
407429 drcov_len : 0 ,
408430 }
409431 }
@@ -466,7 +488,11 @@ impl<F> DrCovModule<F> {
466488 . expect ( "Failed to write coverage file" ) ;
467489 }
468490 }
469- self . drcov_len = DRCOV_IDS . lock ( ) . unwrap ( ) . as_ref ( ) . unwrap ( ) . len ( ) ;
491+ if self . clean_on_flush {
492+ * DRCOV_IDS . lock ( ) . unwrap ( ) = Some ( vec ! [ ] ) ;
493+ } else {
494+ self . drcov_len = DRCOV_IDS . lock ( ) . unwrap ( ) . as_ref ( ) . unwrap ( ) . len ( ) ;
495+ }
470496 } else {
471497 if DRCOV_MAP . lock ( ) . unwrap ( ) . as_ref ( ) . unwrap ( ) . len ( ) > self . drcov_len {
472498 let mut drcov_vec = Vec :: < DrCovBasicBlock > :: new ( ) ;
0 commit comments