From 4855987e331fc887d80639073adbfc5efc09638d Mon Sep 17 00:00:00 2001 From: Eli Lipsitz Date: Fri, 27 Jan 2023 16:00:04 +0000 Subject: pw_build: Fix inaccurate 'num started' display in wrap-ninja This commit fixes an issue where pw-wrap-ninja, when logging actions with --log-actions, would incorrectly display 'batched' "number of events started". That is, ten actions would be printed, all of which would have the same "number started", then it would jump up and more events would be printed. This happened because the UI, which updates every 100ms, would always query the most recent number of events started/finished and print that. This commit addresses the issue by saving the current value of started/finished/total with each event when they occur, so that the UI can accurately print those values. Change-Id: I7c4fe00122e2fa529e64312c41ec2dea7e0b7c18 Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/126986 Reviewed-by: Rob Mohr Pigweed-Auto-Submit: Eli Lipsitz Commit-Queue: Auto-Submit --- pw_build/py/pw_build/wrap_ninja.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/pw_build/py/pw_build/wrap_ninja.py b/pw_build/py/pw_build/wrap_ninja.py index 01e6d9431..bbbc72772 100644 --- a/pw_build/py/pw_build/wrap_ninja.py +++ b/pw_build/py/pw_build/wrap_ninja.py @@ -190,11 +190,17 @@ class NinjaEvent: action: The action this event relates to, if any. message: The log message associated with this event, if it an 'ACTION_LOG' event. + num_started: The number of started actions when this event occurred. + num_finished: The number of finished actions when this event occurred. + num_total: The total number of actions when this event occurred. """ kind: NinjaEventKind action: Optional[NinjaAction] = None log_message: Optional[str] = None + num_started: int = 0 + num_finished: int = 0 + num_total: int = 0 class Ninja: @@ -329,7 +335,7 @@ class Ninja: if actions_started == 1 and actions_finished == 0: for action in self.running_actions.values(): action.end_time = time.time() - self.events.append( + self._add_event( NinjaEvent(NinjaEventKind.ACTION_FINISHED, action) ) self.running_actions = {} @@ -341,7 +347,7 @@ class Ninja: ) if action.jobs == 0: self.actions.append(action) - self.events.append( + self._add_event( NinjaEvent(NinjaEventKind.ACTION_STARTED, action) ) action.jobs += 1 @@ -353,14 +359,14 @@ class Ninja: self.running_actions.pop(name) self.last_action_completed = action action.end_time = time.time() - self.events.append( + self._add_event( NinjaEvent(NinjaEventKind.ACTION_FINISHED, action) ) else: context_action = None if not line.startswith('ninja: '): context_action = self.last_action_completed - self.events.append( + self._add_event( NinjaEvent( NinjaEventKind.ACTION_LOG, action=context_action, @@ -368,6 +374,13 @@ class Ninja: ) ) + def _add_event(self, event: NinjaEvent) -> None: + """Add a new event to the event queue.""" + event.num_started = self.num_started + event.num_finished = self.num_finished + event.num_total = self.num_total + self.events.append(event) + def write_trace(self, file: IO[str]) -> None: """Write a Chromium trace_event-formatted trace to a file.""" now = time.time() @@ -449,7 +462,7 @@ class UI: if event.kind == NinjaEventKind.ACTION_STARTED and show_started: assert event.action self._renderer.print_line( - f'[{self._ninja.num_finished}/{self._ninja.num_total}] ' + f'[{event.num_finished}/{event.num_total}] ' f'Started [{event.action.name}]' ) @@ -459,7 +472,7 @@ class UI: event.action.end_time - event.action.start_time ) self._renderer.print_line( - f'[{self._ninja.num_finished}/{self._ninja.num_total}] ' + f'[{event.num_finished}/{event.num_total}] ' f'Finished [{event.action.name}] ({duration})' ) -- cgit v1.2.3