diff --git a/lglpy/timeline/data/processed_trace.py b/lglpy/timeline/data/processed_trace.py index f7ac7c5..77ce3ba 100644 --- a/lglpy/timeline/data/processed_trace.py +++ b/lglpy/timeline/data/processed_trace.py @@ -77,7 +77,7 @@ def __init__( # Common data we get from the layer metadata self.submit = None self.label_stack = None - self.parsed_label_name = None + self.parsed_label_name: Optional[str] = None if metadata: self.submit = metadata.submit diff --git a/lglpy/timeline/data/raw_trace.py b/lglpy/timeline/data/raw_trace.py index da0cd83..e96a367 100644 --- a/lglpy/timeline/data/raw_trace.py +++ b/lglpy/timeline/data/raw_trace.py @@ -878,6 +878,13 @@ def load_perfetto_from_file( # Sort events into time order trace_events.sort(key=lambda x: x.start_time) + # Replace all interned data cross-references to assign real stream + # names before trying to use streams because we may get more than one + # interned ID for the same physical stream and this will dedupe them + for event in trace_events: + config.replace_interned_stream(event) + config.replace_interned_stage(event) + # Replace time so first event starts at time = 0 and that queued time # waiting for earlier work does not show as running streams = {} @@ -893,7 +900,6 @@ def load_perfetto_from_file( # Later job in stream so remove any overlap with job N-1 last_event = streams[event.stream][-1] last_event_end = last_event.start_time + last_event.duration - streams[event.stream].append(event) # Remove overlap if queued while last event still running if event.start_time <= last_event_end: @@ -901,10 +907,12 @@ def load_perfetto_from_file( event.start_time += time_diff event.duration -= time_diff - # Replace all interned data cross-references - for event in trace_events: - config.replace_interned_stream(event) - config.replace_interned_stage(event) + # Ensure we don't have negative duration events + if event.duration <= 0: + event.duration = 1 + + # Add event to the stream after patching it + streams[event.stream].append(event) return (trace_events, start_time)