summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-04-08 23:33:26 +0800
committerruki <[email protected]>2024-04-08 23:33:26 +0800
commit34ebb2a55c530ec3c050b6dd93e09cef0f6af245 (patch)
treed335eeaa5d9affe926b24ccf62ee6b0bf2fdf90f
parente962877f593141a16e4bae57e985e9023bd901a6 (diff)
fix stuck
-rw-r--r--xmake/modules/async/runjobs.lua11
-rw-r--r--xmake/modules/private/async/jobpool.lua51
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