diff options
| author | ruki <[email protected]> | 2024-04-08 23:33:26 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2024-04-08 23:33:26 +0800 |
| commit | 34ebb2a55c530ec3c050b6dd93e09cef0f6af245 (patch) | |
| tree | d335eeaa5d9affe926b24ccf62ee6b0bf2fdf90f | |
| parent | e962877f593141a16e4bae57e985e9023bd901a6 (diff) | |
fix stuck
| -rw-r--r-- | xmake/modules/async/runjobs.lua | 11 | ||||
| -rw-r--r-- | xmake/modules/private/async/jobpool.lua | 51 |
2 files changed, 28 insertions, 34 deletions
diff --git a/xmake/modules/async/runjobs.lua b/xmake/modules/async/runjobs.lua index 35f51a15a..1f59a7359 100644 --- a/xmake/modules/async/runjobs.lua +++ b/xmake/modules/async/runjobs.lua @@ -236,9 +236,6 @@ function main(name, jobs, opt) end count = count + 1 jobfunc(i, total, {progress = progress_wrapper}) - if job then - jobs:remove(job) - end end running_jobs_indices[i] = nil end, @@ -272,6 +269,14 @@ function main(name, jobs, opt) end end end + }, + finally + { + function () + if job then + jobs:remove(job) + end + end } } end, index) diff --git a/xmake/modules/private/async/jobpool.lua b/xmake/modules/private/async/jobpool.lua index 51c76847f..533283681 100644 --- a/xmake/modules/private/async/jobpool.lua +++ b/xmake/modules/private/async/jobpool.lua @@ -101,32 +101,6 @@ function jobpool:add(job, rootjob) return job end --- has free jobs? -function jobpool:hasfree() - if self:size() == 0 then - return - end - - -- peak a free job from the leaf jobs - local leafjobs = self:_getleafjobs() - if not leafjobs:empty() then - if self._nextfree then - return true - end - local job = leafjobs:last() - while job ~= nil do - local prevjob = leafjobs:prev(job) - if self:_isfree(job) then - self._nextfree = job - return true - elseif job.group or job.status == JOB_STATUS_FINISHED then - self:remove(job) - end - job = prevjob - end - end -end - -- get a free job from the leaf jobs function jobpool:getfree() if self:size() == 0 then @@ -147,20 +121,35 @@ function jobpool:getfree() job.status = JOB_STATUS_PENDING return job end - local job = leafjobs:last() - while job ~= nil do - local prevjob = leafjobs:prev(job) + local removed_jobs = {} + for job in leafjobs:ritems() do if self:_isfree(job) then - local nextfree = prevjob + local nextfree = leafjobs:prev(job) if nextfree ~= job and self:_isfree(nextfree) then self._nextfree = nextfree end job.status = JOB_STATUS_PENDING return job elseif job.group or job.status == JOB_STATUS_FINISHED then + table.insert(removed_jobs, job) + end + end + if #removed_jobs > 0 then + -- try to remove group and referenced node + for _, job in ipairs(removed_jobs) do self:remove(job) end - job = prevjob + -- get free job again + for job in leafjobs:ritems() do + if self:_isfree(job) then + local nextfree = leafjobs:prev(job) + if nextfree ~= job and self:_isfree(nextfree) then + self._nextfree = nextfree + end + job.status = JOB_STATUS_PENDING + return job + end + end end end end |
