summaryrefslogtreecommitdiff
path: root/xmake/modules/async/jobgraph.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2025-04-04 00:42:58 +0800
committerruki <[email protected]>2025-04-08 15:31:57 +0800
commit15d9e01ab37a28d861ce58b1b3701779e94da865 (patch)
treece4b1db9946c57937de07f23f53c1fd5528a151d /xmake/modules/async/jobgraph.lua
parent9adc2943a3ae362b1713b058b6812dc5954c05f0 (diff)
dump jobgraph
Diffstat (limited to 'xmake/modules/async/jobgraph.lua')
-rw-r--r--xmake/modules/async/jobgraph.lua38
1 files changed, 32 insertions, 6 deletions
diff --git a/xmake/modules/async/jobgraph.lua b/xmake/modules/async/jobgraph.lua
index 612ff4882..be1ad57f0 100644
--- a/xmake/modules/async/jobgraph.lua
+++ b/xmake/modules/async/jobgraph.lua
@@ -142,6 +142,7 @@ end
function jobgraph:add_orders(...)
local prev
local prev_is_group
+ local prev_name
local dag = self._dag
local jobs = self._jobs
local groups = self._groups
@@ -163,16 +164,16 @@ function jobgraph:add_orders(...)
assert(curr, "job(%s) not found in jobgraph(%s)", name, self)
if prev then
if prev_is_group and curr_is_group then
- -- we use a fake job as a node to bridge the two groups.
- local fakejob = {}
+ -- we use a bridge job as a node to bridge the two groups.
+ local bridge = {from_group = prev_name, to_group = name}
for _, job in ipairs(prev) do
- if not dag:has_edge(job, fakejob) then
- dag:add_edge(job, fakejob)
+ if not dag:has_edge(job, bridge) then
+ dag:add_edge(job, bridge)
end
end
for _, job in ipairs(curr) do
- if not dag:has_edge(fakejob, job) then
- dag:add_edge(fakejob, job)
+ if not dag:has_edge(bridge, job) then
+ dag:add_edge(bridge, job)
end
end
elseif curr_is_group then
@@ -195,6 +196,7 @@ function jobgraph:add_orders(...)
end
prev = curr
prev_is_group = curr_is_group
+ prev_name = name
end
end
end
@@ -226,6 +228,30 @@ function jobgraph:empty()
return self:size() == 0
end
+-- dump jobgraph
+function jobgraph:dump()
+ print("================================ %s ================================", self)
+ for _, node in ipairs(self._dag:vertices()) do
+ debug.setmetatable(node, {__tostring = function (v)
+ if v.from_group and v.to_group then
+ return string.format("${dim}bridge<%s, %s>${clear}", v.from_group, v.to_group)
+ end
+ return string.format("${color.dump.string_quote}%s${clear}", v.name)
+ end})
+ end
+ self._dag:dump()
+
+ print("")
+ print("groups:")
+ for name, jobs in pairs(self._groups) do
+ print(" group(%s):", name)
+ for _, job in ipairs(jobs) do
+ cprint(" %s", job)
+ end
+ end
+ print("")
+end
+
-- tostring
function jobgraph:__tostring()
return string.format("<jobgraph:%s/%d>", self:name() or "anonymous", self:size())