diff options
| author | ruki <[email protected]> | 2025-04-04 00:42:58 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-04-08 15:31:57 +0800 |
| commit | 15d9e01ab37a28d861ce58b1b3701779e94da865 (patch) | |
| tree | ce4b1db9946c57937de07f23f53c1fd5528a151d /xmake/modules/async/jobgraph.lua | |
| parent | 9adc2943a3ae362b1713b058b6812dc5954c05f0 (diff) | |
dump jobgraph
Diffstat (limited to 'xmake/modules/async/jobgraph.lua')
| -rw-r--r-- | xmake/modules/async/jobgraph.lua | 38 |
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()) |
