@@ -44,8 +44,6 @@ pub struct Event {
44
44
pub status : Option < EventStatus > ,
45
45
/// The elapsed time between event start and process exit/detach.
46
46
pub elapsed : Option < TimeDelta > ,
47
- /// The string representation of the events, used for searching
48
- pub event_line : EventLine ,
49
47
pub id : EventId ,
50
48
}
51
49
@@ -59,7 +57,8 @@ pub struct EventList {
59
57
state : ListState ,
60
58
// TODO: move the event id out of RwLock
61
59
events : VecDeque < Rc < RefCell < Event > > > ,
62
- event_map : HashMap < EventId , Rc < RefCell < Event > > > ,
60
+ /// 0. The string representation of the events, used for searching
61
+ event_map : HashMap < EventId , ( EventLine , Rc < RefCell < Event > > ) > ,
63
62
/// Current window of the event list, [start, end)
64
63
window : ( usize , usize ) ,
65
64
/// Cache of the list items in the view
@@ -77,7 +76,7 @@ pub struct EventList {
77
76
pub baseline : Arc < BaselineInfo > ,
78
77
follow : bool ,
79
78
pub modifier_args : ModifierArgs ,
80
- rt_modifier : RuntimeModifier ,
79
+ pub ( super ) rt_modifier : RuntimeModifier ,
81
80
query : Option < Query > ,
82
81
query_result : Option < QueryResult > ,
83
82
is_ptrace : bool ,
@@ -144,7 +143,12 @@ impl EventList {
144
143
pub fn toggle_env_display ( & mut self ) {
145
144
self . rt_modifier . show_env = !self . rt_modifier . show_env ;
146
145
for event in & self . events {
147
- event. borrow_mut ( ) . event_line . toggle_env_mask ( ) ;
146
+ self
147
+ . event_map
148
+ . get_mut ( & event. borrow ( ) . id )
149
+ . unwrap ( )
150
+ . 0
151
+ . toggle_env_mask ( ) ;
148
152
}
149
153
self . should_refresh_list_cache = true ;
150
154
self . search ( ) ;
@@ -153,7 +157,12 @@ impl EventList {
153
157
pub fn toggle_cwd_display ( & mut self ) {
154
158
self . rt_modifier . show_cwd = !self . rt_modifier . show_cwd ;
155
159
for event in & mut self . events {
156
- event. borrow_mut ( ) . event_line . toggle_cwd_mask ( ) ;
160
+ self
161
+ . event_map
162
+ . get_mut ( & event. borrow ( ) . id )
163
+ . unwrap ( )
164
+ . 0
165
+ . toggle_cwd_mask ( ) ;
157
166
}
158
167
self . should_refresh_list_cache = true ;
159
168
self . search ( ) ;
@@ -211,12 +220,12 @@ impl EventList {
211
220
}
212
221
213
222
pub ( super ) fn get ( & self , id : EventId ) -> Option < Rc < RefCell < Event > > > {
214
- self . event_map . get ( & id) . map ( Rc :: clone)
223
+ self . event_map . get ( & id) . map ( | ( _ , x ) | Rc :: clone ( x ) )
215
224
}
216
225
217
226
pub fn get_map < T > ( & self , id : EventId , f : impl FnOnce ( & Event ) -> T ) -> Option < T > {
218
227
self . event_map . get ( & id) . map ( |e| {
219
- let e = e. borrow ( ) ;
228
+ let e = e. 1 . borrow ( ) ;
220
229
f ( & e)
221
230
} )
222
231
}
@@ -246,9 +255,9 @@ impl EventList {
246
255
// Events won't change during the search because this is Rust and we already have a reference to it.
247
256
// Rust really makes the code more easier to reason about.
248
257
for evt in self . events . iter ( ) {
249
- let evt = evt. borrow ( ) ;
250
- if query. matches ( & evt . event_line ) {
251
- indices. insert ( evt . id ) ;
258
+ let id = evt. borrow ( ) . id ;
259
+ if query. matches ( & self . event_map [ & id ] . 0 ) {
260
+ indices. insert ( id) ;
252
261
}
253
262
}
254
263
let mut result = QueryResult {
@@ -284,9 +293,9 @@ impl EventList {
284
293
. into_inner ( )
285
294
. saturating_sub ( offset) as usize ;
286
295
for evt in self . events . iter ( ) . skip ( start_search_index) {
287
- let evt = evt. borrow ( ) ;
288
- if query. matches ( & evt . event_line ) {
289
- existing_result. indices . insert ( evt . id ) ;
296
+ let id = evt. borrow ( ) . id ;
297
+ if query. matches ( & self . event_map [ & id ] . 0 ) {
298
+ existing_result. indices . insert ( id) ;
290
299
modified = true ;
291
300
}
292
301
}
@@ -338,8 +347,8 @@ impl EventList {
338
347
}
339
348
_ => None ,
340
349
} ;
350
+ let event_line = Event :: to_event_line ( & details, status, & self . baseline , & self . event_modifier ( ) ) ;
341
351
let event = Event {
342
- event_line : Event :: to_event_line ( & details, status, & self . baseline , & self . event_modifier ( ) ) ,
343
352
elapsed : None ,
344
353
details,
345
354
status,
@@ -360,15 +369,23 @@ impl EventList {
360
369
// # SAFETY
361
370
//
362
371
// The event ids are guaranteed to be unique
363
- unsafe { self . event_map . insert_unique_unchecked ( id, event) } ;
372
+ unsafe {
373
+ self
374
+ . event_map
375
+ . insert_unique_unchecked ( id, ( event_line, event) )
376
+ } ;
364
377
self . incremental_search ( ) ;
365
378
if ( self . window . 0 ..self . window . 1 ) . contains ( & ( self . events . len ( ) - 1 ) ) {
366
379
self . should_refresh_list_cache = true ;
367
380
}
368
381
}
369
382
370
383
pub fn set_status ( & mut self , id : EventId , status : Option < EventStatus > ) -> Option < ( ) > {
371
- self . event_map . get_mut ( & id) . map ( |v| v. borrow_mut ( ) ) ?. status = status;
384
+ self
385
+ . event_map
386
+ . get_mut ( & id)
387
+ . map ( |v| v. 1 . borrow_mut ( ) ) ?
388
+ . status = status;
372
389
Some ( ( ) )
373
390
}
374
391
@@ -378,16 +395,28 @@ impl EventList {
378
395
pub ( super ) fn dumb_push ( & mut self , event : Rc < RefCell < Event > > ) {
379
396
let id = event. borrow ( ) . id ;
380
397
self . events . push_back ( event. clone ( ) ) ;
398
+ let evt = event. borrow ( ) ;
399
+ let event_line = Event :: to_event_line (
400
+ & evt. details ,
401
+ evt. status ,
402
+ & self . baseline ,
403
+ & self . event_modifier ( ) ,
404
+ ) ;
405
+ drop ( evt) ;
381
406
// # SAFETY
382
407
//
383
408
// The event ids are guaranteed to be unique
384
- unsafe { self . event_map . insert_unique_unchecked ( id, event) } ;
409
+ unsafe {
410
+ self
411
+ . event_map
412
+ . insert_unique_unchecked ( id, ( event_line, event) )
413
+ } ;
385
414
}
386
415
387
416
pub fn update ( & mut self , update : ProcessStateUpdateEvent ) {
388
417
let modifier = self . event_modifier ( ) ;
389
418
for i in update. ids {
390
- if let Some ( e ) = self . event_map . get ( & i) {
419
+ if let Some ( ( line , e ) ) = self . event_map . get_mut ( & i) {
391
420
let mut e = e. borrow_mut ( ) ;
392
421
if let TracerEventDetails :: Exec ( exec) = e. details . as_ref ( ) {
393
422
if exec. result != 0 {
@@ -399,7 +428,7 @@ impl EventList {
399
428
if let Some ( ts) = update. update . termination_timestamp ( ) {
400
429
e. elapsed = Some ( ts - e. details . timestamp ( ) . unwrap ( ) )
401
430
}
402
- e . event_line = Event :: to_event_line ( & e. details , e. status , & self . baseline , & modifier) ;
431
+ * line = Event :: to_event_line ( & e. details , e. status , & self . baseline , & modifier) ;
403
432
}
404
433
let i = i. into_inner ( ) as usize ;
405
434
if self . window . 0 <= i && i < self . window . 1 {
@@ -411,9 +440,9 @@ impl EventList {
411
440
pub fn rebuild_lines ( & mut self ) {
412
441
// TODO: only update spans that are affected by the change
413
442
let modifier = self . event_modifier ( ) ;
414
- for e in self . events . iter_mut ( ) {
415
- let mut e = e. borrow_mut ( ) ;
416
- e . event_line = Event :: to_event_line ( & e. details , e. status , & self . baseline , & modifier) ;
443
+ for ( _ , ( line , e ) ) in self . event_map . iter_mut ( ) {
444
+ let e = e. borrow ( ) ;
445
+ * line = Event :: to_event_line ( & e. details , e. status , & self . baseline , & modifier) ;
417
446
}
418
447
self . should_refresh_list_cache = true ;
419
448
}
0 commit comments