Compare commits

...
1 Commits
Author SHA1 Message Date
quoije 8b24d391ac Harden Library tab thread cleanup (covers + items)
build / Linux x86_64 (push) Successful in 10m44s
build / Windows x64 (Wine) (push) Successful in 9m0s
Library covers used the same QThread+worker architecture as the store but
never deleted finished threads/loaders, so every reload leaked one QThread
and one CoverLoader. Library item loading leaked its QThread too.

CoverShowcase now removes + deleteLater's loaders on their finished signal
and deletes their threads on thread.finished; MainWindow.load_library deletes
the finished worker and thread instead of only untracking them.
2026-09-14 20:53:30 -04:00
+24
View File
@@ -463,7 +463,9 @@ class CoverShowcase(QWidget):
self.loader.loaded.connect(self._on_loaded) self.loader.loaded.connect(self._on_loaded)
self.loader.failed.connect(self._on_failed) self.loader.failed.connect(self._on_failed)
self.loader.finished.connect(self._on_loading_done) self.loader.finished.connect(self._on_loading_done)
self.loader.finished.connect(self._on_loader_finished)
self.loader.finished.connect(self.thread.quit) self.loader.finished.connect(self.thread.quit)
self.thread.finished.connect(self._on_thread_finished)
self._threads.append(self.thread) self._threads.append(self.thread)
self._loaders.append(self.loader) self._loaders.append(self.loader)
self.thread.start() self.thread.start()
@@ -521,6 +523,26 @@ class CoverShowcase(QWidget):
self._loading = False self._loading = False
self._update_status() self._update_status()
def _on_loader_finished(self):
"""Drop a finished cover loader from tracking and schedule its deletion."""
loader = self.sender()
if loader is None:
return
if loader in self._loaders:
self._loaders.remove(loader)
if self.loader is loader:
self.loader = None
loader.deleteLater()
def _on_thread_finished(self):
"""Delete a finished cover-loader thread."""
thread = self.sender()
if thread in self._threads:
self._threads.remove(thread)
if self.thread is thread:
self.thread = None
thread.deleteLater()
def _update_status(self): def _update_status(self):
if self._closing: if self._closing:
return return
@@ -4790,6 +4812,8 @@ class MainWindow(QMainWindow):
thread.started.connect(worker.run) thread.started.connect(worker.run)
worker.result.connect(self._on_library_loaded) worker.result.connect(self._on_library_loaded)
worker.finished.connect(thread.quit) worker.finished.connect(thread.quit)
worker.finished.connect(worker.deleteLater)
thread.finished.connect(thread.deleteLater)
thread.finished.connect(lambda t=thread, w=worker: self._forget_library_thread(t, w)) thread.finished.connect(lambda t=thread, w=worker: self._forget_library_thread(t, w))
self._library_threads.append(thread) self._library_threads.append(thread)
self._library_workers.append(worker) self._library_workers.append(worker)