@@ -61,10 +61,10 @@ void Profile::rebuild_tree()
61
61
{
62
62
Vector<NonnullRefPtr<ProfileNode>> roots;
63
63
64
- auto find_or_create_process_node = [this , &roots](pid_t pid, u64 timestamp ) -> ProfileNode& {
65
- auto * process = find_process (pid, timestamp );
64
+ auto find_or_create_process_node = [this , &roots](pid_t pid, EventSerialNumber serial ) -> ProfileNode& {
65
+ auto * process = find_process (pid, serial );
66
66
if (!process) {
67
- dbgln (" Profile contains event for unknown process with pid={}, timestamp ={}" , pid, timestamp );
67
+ dbgln (" Profile contains event for unknown process with pid={}, serial ={}" , pid, serial. to_number () );
68
68
VERIFY_NOT_REACHED ();
69
69
}
70
70
for (auto root : roots) {
@@ -96,7 +96,7 @@ void Profile::rebuild_tree()
96
96
continue ;
97
97
}
98
98
99
- if (!process_filter_contains (event.pid , event.timestamp ))
99
+ if (!process_filter_contains (event.pid , event.serial ))
100
100
continue ;
101
101
102
102
m_filtered_event_indices.append (event_index);
@@ -123,7 +123,7 @@ void Profile::rebuild_tree()
123
123
124
124
if (!m_show_top_functions) {
125
125
ProfileNode* node = nullptr ;
126
- auto & process_node = find_or_create_process_node (event.pid , event.timestamp );
126
+ auto & process_node = find_or_create_process_node (event.pid , event.serial );
127
127
process_node.increment_event_count ();
128
128
for_each_frame ([&](const Frame& frame, bool is_innermost_frame) {
129
129
auto & object_name = frame.object_name ;
@@ -147,7 +147,7 @@ void Profile::rebuild_tree()
147
147
return IterationDecision::Continue;
148
148
});
149
149
} else {
150
- auto & process_node = find_or_create_process_node (event.pid , event.timestamp );
150
+ auto & process_node = find_or_create_process_node (event.pid , event.serial );
151
151
process_node.increment_event_count ();
152
152
for (size_t i = 0 ; i < event.frames .size (); ++i) {
153
153
ProfileNode* node = nullptr ;
@@ -163,7 +163,7 @@ void Profile::rebuild_tree()
163
163
164
164
// FIXME: More PID/TID mixing cheats here:
165
165
if (!node) {
166
- node = &find_or_create_process_node (event.pid , event.timestamp );
166
+ node = &find_or_create_process_node (event.pid , event.serial );
167
167
node = &node->find_or_create_child (object_name, symbol, address, offset, event.timestamp , event.pid );
168
168
root = node;
169
169
root->will_track_seen_events (m_events.size ());
@@ -219,12 +219,15 @@ Result<NonnullOwnPtr<Profile>, String> Profile::load_from_perfcore_file(const St
219
219
NonnullOwnPtrVector<Process> all_processes;
220
220
HashMap<pid_t , Process*> current_processes;
221
221
Vector<Event> events;
222
+ EventSerialNumber next_serial;
222
223
223
224
for (auto & perf_event_value : perf_events.values ()) {
224
225
auto & perf_event = perf_event_value.as_object ();
225
226
226
227
Event event;
227
228
229
+ event.serial = next_serial;
230
+ next_serial.increment ();
228
231
event.timestamp = perf_event.get (" timestamp" ).to_number <u64 >();
229
232
event.lost_samples = perf_event.get (" lost_samples" ).to_number <u32 >();
230
233
event.type = perf_event.get (" type" ).to_string ();
@@ -257,7 +260,8 @@ Result<NonnullOwnPtr<Profile>, String> Profile::load_from_perfcore_file(const St
257
260
.pid = event.pid ,
258
261
.executable = event.executable ,
259
262
.basename = LexicalPath (event.executable ).basename (),
260
- .start_valid = event.timestamp ,
263
+ .start_valid = event.serial ,
264
+ .end_valid = {},
261
265
});
262
266
263
267
current_processes.set (sampled_process->pid , sampled_process);
@@ -267,35 +271,37 @@ Result<NonnullOwnPtr<Profile>, String> Profile::load_from_perfcore_file(const St
267
271
event.executable = perf_event.get (" executable" ).to_string ();
268
272
269
273
auto old_process = current_processes.get (event.pid ).value ();
270
- old_process->end_valid = event.timestamp ;
274
+ old_process->end_valid = event.serial ;
271
275
272
276
current_processes.remove (event.pid );
273
277
274
278
auto sampled_process = adopt_own (*new Process {
275
279
.pid = event.pid ,
276
280
.executable = event.executable ,
277
281
.basename = LexicalPath (event.executable ).basename (),
278
- .start_valid = event.timestamp });
282
+ .start_valid = event.serial ,
283
+ .end_valid = {},
284
+ });
279
285
280
286
current_processes.set (sampled_process->pid , sampled_process);
281
287
all_processes.append (move (sampled_process));
282
288
continue ;
283
289
} else if (event.type == " process_exit" sv) {
284
290
auto old_process = current_processes.get (event.pid ).value ();
285
- old_process->end_valid = event.timestamp ;
291
+ old_process->end_valid = event.serial ;
286
292
287
293
current_processes.remove (event.pid );
288
294
continue ;
289
295
} else if (event.type == " thread_create" sv) {
290
296
event.parent_tid = perf_event.get (" parent_tid" ).to_i32 ();
291
297
auto it = current_processes.find (event.pid );
292
298
if (it != current_processes.end ())
293
- it->value ->handle_thread_create (event.tid , event.timestamp );
299
+ it->value ->handle_thread_create (event.tid , event.serial );
294
300
continue ;
295
301
} else if (event.type == " thread_exit" sv) {
296
302
auto it = current_processes.find (event.pid );
297
303
if (it != current_processes.end ())
298
- it->value ->handle_thread_exit (event.tid , event.timestamp );
304
+ it->value ->handle_thread_exit (event.tid , event.serial );
299
305
continue ;
300
306
}
301
307
@@ -385,7 +391,7 @@ void Profile::clear_timestamp_filter_range()
385
391
m_samples_model->update ();
386
392
}
387
393
388
- void Profile::add_process_filter (pid_t pid, u64 start_valid, u64 end_valid)
394
+ void Profile::add_process_filter (pid_t pid, EventSerialNumber start_valid, EventSerialNumber end_valid)
389
395
{
390
396
auto filter = ProcessFilter { pid, start_valid, end_valid };
391
397
if (m_process_filters.contains_slow (filter))
@@ -398,7 +404,7 @@ void Profile::add_process_filter(pid_t pid, u64 start_valid, u64 end_valid)
398
404
m_samples_model->update ();
399
405
}
400
406
401
- void Profile::remove_process_filter (pid_t pid, u64 start_valid, u64 end_valid)
407
+ void Profile::remove_process_filter (pid_t pid, EventSerialNumber start_valid, EventSerialNumber end_valid)
402
408
{
403
409
auto filter = ProcessFilter { pid, start_valid, end_valid };
404
410
if (!m_process_filters.contains_slow (filter))
@@ -424,13 +430,13 @@ void Profile::clear_process_filter()
424
430
m_samples_model->update ();
425
431
}
426
432
427
- bool Profile::process_filter_contains (pid_t pid, u32 timestamp )
433
+ bool Profile::process_filter_contains (pid_t pid, EventSerialNumber serial )
428
434
{
429
435
if (!has_process_filter ())
430
436
return true ;
431
437
432
438
for (auto const & process_filter : m_process_filters)
433
- if (pid == process_filter.pid && timestamp >= process_filter.start_valid && timestamp <= process_filter.end_valid )
439
+ if (pid == process_filter.pid && serial >= process_filter.start_valid && serial <= process_filter.end_valid )
434
440
return true ;
435
441
436
442
return false ;
0 commit comments