Fix store FD exhaustion: run cover/date loaders one at a time

This commit is contained in:
2026-09-14 00:38:37 -04:00
parent 3359ecf131
commit 58d348859a
+28 -2
View File
@@ -1831,6 +1831,8 @@ class StorePage(QWidget):
self._lib_cover = {} # norm -> (release_id, system)
self._psp_norm = set() # norm of library items installed on the PSP
self._cover_attempted = set()
self._cover_busy = False
self._date_busy = False
self._generation = 0
self._scan_gen = 0
self._meta_gen = 0
@@ -2180,6 +2182,8 @@ class StorePage(QWidget):
self._cover_next = 0
self._date_queue = []
self._date_next = 0
self._cover_busy = False
self._date_busy = False
self._cover_attempted.clear()
self._placeholder = QIcon(_placeholder_pixmap(self.ICON_W, self.ICON_H))
@@ -2305,13 +2309,14 @@ class StorePage(QWidget):
self._load_date_batch(self.DATE_BATCH)
def _load_cover_batch(self, n):
if self._closing or not self._cover_queue:
if self._closing or not self._cover_queue or self._cover_busy:
return
end = min(self._cover_next + n, len(self._cover_queue))
if self._cover_next >= end:
return
tasks = self._cover_queue[self._cover_next:end]
self._cover_next = end
self._cover_busy = True
self._start_cover_loader(self._generation, tasks)
def _active_scrollbar(self):
@@ -2342,13 +2347,14 @@ class StorePage(QWidget):
self._fill_timer.start()
def _load_date_batch(self, n):
if self._closing or not self._date_queue:
if self._closing or not self._date_queue or self._date_busy:
return
end = min(self._date_next + n, len(self._date_queue))
if self._date_next >= end:
return
tasks = self._date_queue[self._date_next:end]
self._date_next = end
self._date_busy = True
self._start_date_loader(self._generation, tasks)
def _start_date_loader(self, gen, tasks):
@@ -2359,12 +2365,22 @@ class StorePage(QWidget):
loader.moveToThread(thread)
thread.started.connect(loader.run)
loader.loaded.connect(self._on_date_loaded)
loader.finished.connect(self._on_date_batch_done)
loader.finished.connect(thread.quit)
thread.finished.connect(self._on_thread_finished)
self._threads.append(thread)
self._loaders.append(loader)
thread.start()
def _on_date_batch_done(self):
if self._closing:
return
loader = self.sender()
if getattr(loader, "gen", None) != self._generation:
return
self._date_busy = False
self._load_date_batch(self.DATE_BATCH)
def _on_date_loaded(self, gen, row, date):
if self._closing or gen != self._generation or not date:
return
@@ -2382,12 +2398,22 @@ class StorePage(QWidget):
loader.moveToThread(thread)
thread.started.connect(loader.run)
loader.loaded.connect(self._on_cover_loaded)
loader.finished.connect(self._on_cover_batch_done)
loader.finished.connect(thread.quit)
thread.finished.connect(self._on_thread_finished)
self._threads.append(thread)
self._loaders.append(loader)
thread.start()
def _on_cover_batch_done(self):
if self._closing:
return
loader = self.sender()
if getattr(loader, "gen", None) != self._generation:
return
self._cover_busy = False
self._load_cover_batch(self.COVER_SCROLL_BATCH)
def _on_cover_loaded(self, gen, row, image):
if self._closing or gen != self._generation:
return