Fix store FD exhaustion: run cover/date loaders one at a time
This commit is contained in:
+28
-2
@@ -1831,6 +1831,8 @@ class StorePage(QWidget):
|
|||||||
self._lib_cover = {} # norm -> (release_id, system)
|
self._lib_cover = {} # norm -> (release_id, system)
|
||||||
self._psp_norm = set() # norm of library items installed on the PSP
|
self._psp_norm = set() # norm of library items installed on the PSP
|
||||||
self._cover_attempted = set()
|
self._cover_attempted = set()
|
||||||
|
self._cover_busy = False
|
||||||
|
self._date_busy = False
|
||||||
self._generation = 0
|
self._generation = 0
|
||||||
self._scan_gen = 0
|
self._scan_gen = 0
|
||||||
self._meta_gen = 0
|
self._meta_gen = 0
|
||||||
@@ -2180,6 +2182,8 @@ class StorePage(QWidget):
|
|||||||
self._cover_next = 0
|
self._cover_next = 0
|
||||||
self._date_queue = []
|
self._date_queue = []
|
||||||
self._date_next = 0
|
self._date_next = 0
|
||||||
|
self._cover_busy = False
|
||||||
|
self._date_busy = False
|
||||||
self._cover_attempted.clear()
|
self._cover_attempted.clear()
|
||||||
self._placeholder = QIcon(_placeholder_pixmap(self.ICON_W, self.ICON_H))
|
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)
|
self._load_date_batch(self.DATE_BATCH)
|
||||||
|
|
||||||
def _load_cover_batch(self, n):
|
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
|
return
|
||||||
end = min(self._cover_next + n, len(self._cover_queue))
|
end = min(self._cover_next + n, len(self._cover_queue))
|
||||||
if self._cover_next >= end:
|
if self._cover_next >= end:
|
||||||
return
|
return
|
||||||
tasks = self._cover_queue[self._cover_next:end]
|
tasks = self._cover_queue[self._cover_next:end]
|
||||||
self._cover_next = end
|
self._cover_next = end
|
||||||
|
self._cover_busy = True
|
||||||
self._start_cover_loader(self._generation, tasks)
|
self._start_cover_loader(self._generation, tasks)
|
||||||
|
|
||||||
def _active_scrollbar(self):
|
def _active_scrollbar(self):
|
||||||
@@ -2342,13 +2347,14 @@ class StorePage(QWidget):
|
|||||||
self._fill_timer.start()
|
self._fill_timer.start()
|
||||||
|
|
||||||
def _load_date_batch(self, n):
|
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
|
return
|
||||||
end = min(self._date_next + n, len(self._date_queue))
|
end = min(self._date_next + n, len(self._date_queue))
|
||||||
if self._date_next >= end:
|
if self._date_next >= end:
|
||||||
return
|
return
|
||||||
tasks = self._date_queue[self._date_next:end]
|
tasks = self._date_queue[self._date_next:end]
|
||||||
self._date_next = end
|
self._date_next = end
|
||||||
|
self._date_busy = True
|
||||||
self._start_date_loader(self._generation, tasks)
|
self._start_date_loader(self._generation, tasks)
|
||||||
|
|
||||||
def _start_date_loader(self, gen, tasks):
|
def _start_date_loader(self, gen, tasks):
|
||||||
@@ -2359,12 +2365,22 @@ class StorePage(QWidget):
|
|||||||
loader.moveToThread(thread)
|
loader.moveToThread(thread)
|
||||||
thread.started.connect(loader.run)
|
thread.started.connect(loader.run)
|
||||||
loader.loaded.connect(self._on_date_loaded)
|
loader.loaded.connect(self._on_date_loaded)
|
||||||
|
loader.finished.connect(self._on_date_batch_done)
|
||||||
loader.finished.connect(thread.quit)
|
loader.finished.connect(thread.quit)
|
||||||
thread.finished.connect(self._on_thread_finished)
|
thread.finished.connect(self._on_thread_finished)
|
||||||
self._threads.append(thread)
|
self._threads.append(thread)
|
||||||
self._loaders.append(loader)
|
self._loaders.append(loader)
|
||||||
thread.start()
|
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):
|
def _on_date_loaded(self, gen, row, date):
|
||||||
if self._closing or gen != self._generation or not date:
|
if self._closing or gen != self._generation or not date:
|
||||||
return
|
return
|
||||||
@@ -2382,12 +2398,22 @@ class StorePage(QWidget):
|
|||||||
loader.moveToThread(thread)
|
loader.moveToThread(thread)
|
||||||
thread.started.connect(loader.run)
|
thread.started.connect(loader.run)
|
||||||
loader.loaded.connect(self._on_cover_loaded)
|
loader.loaded.connect(self._on_cover_loaded)
|
||||||
|
loader.finished.connect(self._on_cover_batch_done)
|
||||||
loader.finished.connect(thread.quit)
|
loader.finished.connect(thread.quit)
|
||||||
thread.finished.connect(self._on_thread_finished)
|
thread.finished.connect(self._on_thread_finished)
|
||||||
self._threads.append(thread)
|
self._threads.append(thread)
|
||||||
self._loaders.append(loader)
|
self._loaders.append(loader)
|
||||||
thread.start()
|
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):
|
def _on_cover_loaded(self, gen, row, image):
|
||||||
if self._closing or gen != self._generation:
|
if self._closing or gen != self._generation:
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user