33export module lib:initgraph;
44
55import :log;
6+ import :list;
67import :bug_on;
78import :panic;
8- import frigg;
99import std;
1010
1111// this code is yoinked from managarm
@@ -34,8 +34,8 @@ export namespace lib::initgraph
3434 node *_source;
3535 node *_target;
3636
37- frg::default_list_hook <edge> _outhook;
38- frg::default_list_hook <edge> _inhook;
37+ lib::intrusive_list_hook <edge> _outhook;
38+ lib::intrusive_list_hook <edge> _inhook;
3939
4040 public:
4141 edge (node *source, node *target)
@@ -59,26 +59,11 @@ export namespace lib::initgraph
5959 engine *_engine;
6060 std::string_view _name;
6161
62- frg::intrusive_list<
63- edge,
64- frg::locate_member<
65- edge,
66- frg::default_list_hook<edge>,
67- &edge::_outhook
68- >
69- > _outlist;
70-
71- frg::intrusive_list<
72- edge,
73- frg::locate_member<
74- edge,
75- frg::default_list_hook<edge>,
76- &edge::_inhook
77- >
78- > _inlist;
79-
80- frg::default_list_hook<node> _nodeshook;
81- frg::default_list_hook<node> _queuehook;
62+ lib::intrusive_list<edge, &edge::_outhook> _outlist;
63+ lib::intrusive_list<edge, &edge::_inhook> _inlist;
64+
65+ lib::intrusive_list_hook<node> _nodeshook;
66+ lib::intrusive_list_hook<node> _queuehook;
8267
8368 bool _wanted = false ;
8469 bool _done = false ;
@@ -108,23 +93,8 @@ export namespace lib::initgraph
10893 friend void realise_node (node *node);
10994
11095 private:
111- frg::intrusive_list<
112- node,
113- frg::locate_member<
114- node,
115- frg::default_list_hook<node>,
116- &node::_nodeshook
117- >
118- > _nodes;
119-
120- frg::intrusive_list<
121- node,
122- frg::locate_member<
123- node,
124- frg::default_list_hook<node>,
125- &node::_queuehook
126- >
127- > _pending;
96+ lib::intrusive_list<node, &node::_nodeshook> _nodes;
97+ lib::intrusive_list<node, &node::_queuehook> _pending;
12898
12999 std::string_view _name;
130100
@@ -173,16 +143,16 @@ export namespace lib::initgraph
173143 if constexpr (debug)
174144 lib::debug (" initgraph: running engine '{}'" , _name);
175145
176- for (auto node : _nodes)
177- node-> _wanted = true ;
146+ for (auto & node : _nodes)
147+ node. _wanted = true ;
178148
179- for (auto node : _nodes)
149+ for (auto & node : _nodes)
180150 {
181- if (!node-> _wanted || node-> _done )
151+ if (!node. _wanted || node. _done )
182152 continue ;
183153
184- if (node-> unsatisfied == 0 )
185- _pending.push_back (node);
154+ if (node. unsatisfied == 0 )
155+ _pending.push_back (std::addressof ( node) );
186156 }
187157
188158 while (!_pending.empty ())
@@ -199,9 +169,9 @@ export namespace lib::initgraph
199169 if constexpr (debug)
200170 post_activate (current);
201171
202- for (auto edge : current->_outlist )
172+ for (auto & edge : current->_outlist )
203173 {
204- auto successor = edge-> _target ;
174+ auto successor = edge. _target ;
205175 lib::bug_on (successor->unsatisfied == 0 );
206176 successor->unsatisfied --;
207177
@@ -211,12 +181,12 @@ export namespace lib::initgraph
211181 }
212182
213183 std::uint32_t unreached = 0 ;
214- for (auto node : _nodes)
184+ for (auto & node : _nodes)
215185 {
216- if (!node-> _wanted || node-> _done )
186+ if (!node. _wanted || node. _done )
217187 continue ;
218188
219- report_unreached (node);
189+ report_unreached (std::addressof ( node) );
220190 unreached++;
221191 }
222192
@@ -245,7 +215,8 @@ export namespace lib::initgraph
245215 edge->_target ->_inlist .push_back (edge);
246216 edge->_target ->unsatisfied ++;
247217
248- // edge->source()->engine()->on_realise_edge(edge);
218+ // if constexpr (debug)
219+ // edge->source()->engine()->on_realise_edge(edge);
249220 }
250221
251222 struct stage final : public node
0 commit comments