From d4a52b75480cd69724a8d14c7744b032d91072dd Mon Sep 17 00:00:00 2001 From: Kieran Black Date: Sun, 25 Feb 2024 00:17:04 -0600 Subject: [PATCH] fix progress manager window race condition (#3029) The progress manager was indicating windows were in a clean state before actually ensuring they were in a clean state. The update to mark things as clean now occurs after cleanup has occurred. --- qt/aqt/progress.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/qt/aqt/progress.py b/qt/aqt/progress.py index 0dbd203fd..bbed1ff96 100644 --- a/qt/aqt/progress.py +++ b/qt/aqt/progress.py @@ -223,9 +223,11 @@ class ProgressManager: self._win.form.progressBar.setValue(self._counter) def finish(self) -> None: - self._levels -= 1 - self._levels = max(0, self._levels) - if self._levels == 0: + # we must latch the levels update and perform it after cleanup has occured or we expose ourselves to a race + # condition where a second progress could see levels == 0 and wrongly assume everything is in a clean state + next_levels = self._levels - 1 + next_levels = max(0, next_levels) + if next_levels == 0: if self._win: self._closeWin() if self._busy_cursor_timer: @@ -239,6 +241,7 @@ class ProgressManager: self._backend_timer.stop() self._backend_timer.deleteLater() self._backend_timer = None + self._levels = next_levels def clear(self) -> None: "Restore the interface after an error."