diff --git a/plugins/coverbrowser.koplugin/bookinfomanager.lua b/plugins/coverbrowser.koplugin/bookinfomanager.lua index 59e1e3792..a925fd416 100644 --- a/plugins/coverbrowser.koplugin/bookinfomanager.lua +++ b/plugins/coverbrowser.koplugin/bookinfomanager.lua @@ -617,25 +617,27 @@ end -- Background extraction management function BookInfoManager:collectSubprocesses() + self.subprocesses_collector = nil + -- We need to regularly watch if a sub-process has terminated by -- calling waitpid() so this process does not become a zombie hanging -- around till we exit. if #self.subprocesses_pids > 0 then - local i = 1 - while i <= #self.subprocesses_pids do -- clean in-place + -- In-place removal, hence the reverse iteration. + for i = #self.subprocesses_pids, 1, -1 do local pid = self.subprocesses_pids[i] if FFIUtil.isSubProcessDone(pid) then table.remove(self.subprocesses_pids, i) -- Prevent has been issued for each bg task spawn, we must allow for each death too. UIManager:allowStandby() - else - i = i + 1 end end if #self.subprocesses_pids > 0 then -- still some pids around, we'll need to collect again - self.subprocesses_collector = UIManager:scheduleIn( - self.subprocesses_collect_interval, function() + self.subprocesses_collector = true + UIManager:scheduleIn( + self.subprocesses_collect_interval, + function() self:collectSubprocesses() end ) @@ -650,7 +652,6 @@ function BookInfoManager:collectSubprocesses() -- we'll collect them next time we're run end else - self.subprocesses_collector = nil if self.delayed_cleanup then self.delayed_cleanup = false -- No more subprocesses = no more crengine indexing, we can remove our @@ -661,7 +662,9 @@ function BookInfoManager:collectSubprocesses() end -- We're done, back to a single core - Device:enableCPUCores(1) + if #self.subprocesses_pids == 0 then + Device:enableCPUCores(1) + end end function BookInfoManager:terminateBackgroundJobs() @@ -722,8 +725,10 @@ function BookInfoManager:extractInBackground(files) -- and fill linux processes table) -- We set a single scheduled action for that if not self.subprocesses_collector then -- there's not one already scheduled - self.subprocesses_collector = UIManager:scheduleIn( - self.subprocesses_collect_interval, function() + self.subprocesses_collector = true + UIManager:scheduleIn( + self.subprocesses_collect_interval, + function() self:collectSubprocesses() end )