summaryrefslogtreecommitdiff
path: root/xmake/modules/private/async
diff options
context:
space:
mode:
authorruki <[email protected]>2020-03-17 23:14:42 +0800
committerruki <[email protected]>2020-03-17 13:28:12 +0800
commit0924c3f19f63006333f05dbf83f6f152d8a1c920 (patch)
tree566c6d179eea0b390dfb1a5ec61372d4e9714957 /xmake/modules/private/async
parentd6d0c6d91c030896f56bca97f8bf380b7b49c2ad (diff)
fix targetdeps for jobpool
Diffstat (limited to 'xmake/modules/private/async')
-rw-r--r--xmake/modules/private/async/jobpool.lua98
-rw-r--r--xmake/modules/private/async/runjobs.lua2
2 files changed, 54 insertions, 46 deletions
diff --git a/xmake/modules/private/async/jobpool.lua b/xmake/modules/private/async/jobpool.lua
index 702d1aa89..ca38d397f 100644
--- a/xmake/modules/private/async/jobpool.lua
+++ b/xmake/modules/private/async/jobpool.lua
@@ -43,27 +43,43 @@ end
-- @param rootjob the root job node (optional)
--
function jobpool:addjob(name, run, rootjob)
+ return self:add({name = name, run = run}, rootjob)
+end
+
+-- add job to the given job node
+--
+-- @param job the job
+-- @param rootjob the root job node (optional)
+--
+function jobpool:add(job, rootjob)
-- add job to the root job
rootjob = rootjob or self:rootjob()
- local job = {name = name, run = run, _parent = rootjob}
rootjob._deps = rootjob._deps or dlist:new()
rootjob._deps:push(job)
- self._size = self._size + 1
+
+ -- attach parents node
+ local parents = job._parents
+ if not parents then
+ parents = {}
+ job._parents = parents
+ self._size = self._size + 1 -- @note only update number for new job without parents
+ end
+ table.insert(parents, rootjob)
-- in group? attach the group node
local group = self._group
if group then
job._deps = job._deps or dlist:new()
job._deps:push(group)
- group._parent = group._parent or {}
- table.insert(group._parent, job)
+ group._parents = group._parents or {}
+ table.insert(group._parents, job)
end
return job
end
-- pop job without deps at leaf node
-function jobpool:popjob()
+function jobpool:pop()
-- no jobs?
if self:size() == 0 then
@@ -73,8 +89,8 @@ function jobpool:popjob()
-- init leaf jobs first
local leafjobs = self._leafjobs
if #leafjobs == 0 then
- local groups = {}
- self:_genleafjobs(self:rootjob(), leafjobs, groups)
+ local refs = {}
+ self:_genleafjobs(self:rootjob(), leafjobs, refs)
end
-- pop a job from the leaf jobs
@@ -84,31 +100,26 @@ function jobpool:popjob()
local job = leafjobs[#leafjobs]
table.remove(leafjobs, #leafjobs)
- -- get priority and parent node
+ -- get priority and parents node
local priority = job._priority or 0
- local parent = assert(job._parent, "invalid job without parent node!")
+ local parents = assert(job._parents, "invalid job without parents node!")
- -- is group node? remove it from all parent jobs
- if job.group then
- for _, p in ipairs(parent) do
- p._priority = math.max(p._priority or 0, priority + 1)
- p._deps:remove(job)
- if p._deps:empty() and self._size > 0 then
- table.insert(leafjobs, 1, p)
- end
+ -- update all parents nodes
+ for _, p in ipairs(parents) do
+ p._priority = math.max(p._priority or 0, priority + 1)
+ p._deps:remove(job)
+ if p._deps:empty() and self._size > 0 then
+ table.insert(leafjobs, 1, p)
end
- return self:popjob()
- else
+ end
- -- update jobs size
+ -- is group node?
+ if job.group then
+ -- pop the next real job
+ return self:pop()
+ else
+ -- pop this job
self._size = self._size - 1
-
- -- remove this job from the parent job
- parent._priority = math.max(parent._priority or 0, priority + 1)
- parent._deps:remove(job)
- if parent._deps:empty() and self._size > 0 then
- table.insert(leafjobs, 1, parent)
- end
return job, priority
end
end
@@ -130,23 +141,20 @@ end
function jobpool:group_leave()
local group = self._group
self._group = nil
- if group and group._parent then
+ if group and group._parents then
return group
end
end
-- generate all leaf jobs from the given job
-function jobpool:_genleafjobs(job, leafjobs, groups)
+function jobpool:_genleafjobs(job, leafjobs, refs)
local deps = job._deps
if deps and not deps:empty() then
for dep in deps:items() do
- if dep.group then
- if not groups[dep.name] then
- groups[dep.name] = true
- self:_genleafjobs(dep, leafjobs, groups)
- end
- else
- self:_genleafjobs(dep, leafjobs, groups)
+ local depkey = tostring(dep)
+ if not refs[depkey] then
+ refs[depkey] = true
+ self:_genleafjobs(dep, leafjobs, refs)
end
end
else
@@ -155,18 +163,18 @@ function jobpool:_genleafjobs(job, leafjobs, groups)
end
-- generate jobs tree for the given job
-function jobpool:_gentree(job, groups)
+function jobpool:_gentree(job, refs)
local tree = {job.group and ("group(" .. job.name .. ")") or job.name}
local deps = job._deps
if deps and not deps:empty() then
for dep in deps:items() do
- if dep.group then
- if not groups[dep.name] then
- groups[dep.name] = true
- table.insert(tree, self:_gentree(dep, groups))
- end
+ local depkey = tostring(dep)
+ if refs[depkey] then
+ local depname = dep.group and ("group(" .. dep.name .. ")") or dep.name
+ table.insert(tree, "ref(" .. depname .. ")")
else
- table.insert(tree, self:_gentree(dep, groups))
+ refs[depkey] = true
+ table.insert(tree, self:_gentree(dep, refs))
end
end
end
@@ -185,8 +193,8 @@ end
-- tostring
function jobpool:__tostring()
- local groups = {}
- return string.serialize(self:_gentree(self:rootjob(), groups), {indent = 2})
+ local refs = {}
+ return string.serialize(self:_gentree(self:rootjob(), refs), {indent = 2})
end
-- new a jobpool
diff --git a/xmake/modules/private/async/runjobs.lua b/xmake/modules/private/async/runjobs.lua
index 6ca176789..2b848bde5 100644
--- a/xmake/modules/private/async/runjobs.lua
+++ b/xmake/modules/private/async/runjobs.lua
@@ -157,7 +157,7 @@ function main(name, jobs, opt)
job = job_pending
priority = priority_prev
else
- job, priority = jobs:popjob()
+ job, priority = jobs:pop()
end
if not job then
break