diff --git a/repos/base-hw/src/core/kernel/ipc_node.cc b/repos/base-hw/src/core/kernel/ipc_node.cc index ade00fad0..a55858594 100644 --- a/repos/base-hw/src/core/kernel/ipc_node.cc +++ b/repos/base-hw/src/core/kernel/ipc_node.cc @@ -52,14 +52,16 @@ void Ipc_node::_announce_request(Ipc_node &node) } /* cannot receive yet, so queue request */ - _request_queue.enqueue(node); + _request_queue.enqueue(node._request_queue_item); } void Ipc_node::_cancel_request_queue() { - _request_queue.dequeue_all([] (Ipc_node &node) { - node._outbuf_request_cancelled(); }); + _request_queue.dequeue_all([] (Queue_item &item) { + Ipc_node &node { item.object() }; + node._outbuf_request_cancelled(); + }); } @@ -84,7 +86,7 @@ void Ipc_node::_cancel_inbuf_request() void Ipc_node::_announced_request_cancelled(Ipc_node &node) { if (_caller == &node) _caller = nullptr; - else _request_queue.remove(node); + else _request_queue.remove(node._request_queue_item); } @@ -137,8 +139,8 @@ bool Ipc_node::await_request() _state = AWAIT_REQUEST; /* if anybody already announced a request receive it */ - _request_queue.dequeue([&] (Ipc_node &ipc) { - _receive_request(ipc); + _request_queue.dequeue([&] (Queue_item &item) { + _receive_request(item.object()); announced = true; }); return announced; diff --git a/repos/base-hw/src/core/kernel/ipc_node.h b/repos/base-hw/src/core/kernel/ipc_node.h index cb31f3509..9e82b981d 100644 --- a/repos/base-hw/src/core/kernel/ipc_node.h +++ b/repos/base-hw/src/core/kernel/ipc_node.h @@ -18,8 +18,6 @@ /* Genode includes */ #include -namespace Genode { class Msgbuf_base; }; - namespace Kernel { class Thread; @@ -28,13 +26,14 @@ namespace Kernel * Backend for end points of synchronous interprocess communication */ class Ipc_node; - - using Ipc_node_queue = Genode::Fifo; } -class Kernel::Ipc_node : private Ipc_node_queue::Element +class Kernel::Ipc_node { - protected: + private: + + using Queue_item = Genode::Fifo_element; + using Queue = Genode::Fifo; enum State { @@ -43,18 +42,13 @@ class Kernel::Ipc_node : private Ipc_node_queue::Element AWAIT_REQUEST = 3, }; - - private: - - friend class Core_thread; - friend class Genode::Fifo; - - Thread &_thread; - State _state { INACTIVE }; - Ipc_node * _caller { nullptr }; - Ipc_node * _callee { nullptr }; - bool _help { false }; - Ipc_node_queue _request_queue { }; + Thread &_thread; + Queue_item _request_queue_item { *this }; + State _state { INACTIVE }; + Ipc_node *_caller { nullptr }; + Ipc_node *_callee { nullptr }; + bool _help { false }; + Queue _request_queue { }; /** * Buffer next request from request queue in 'r' to handle it @@ -146,8 +140,10 @@ class Kernel::Ipc_node : private Ipc_node_queue::Element if (_caller && _caller->_help) f(*_caller); /* call 'f' for each helper in our request queue */ - _request_queue.for_each([f] (Ipc_node &node) { - if (node._help) f(node); }); + _request_queue.for_each([f] (Queue_item &item) { + Ipc_node &node { item.object() }; + if (node._help) f(node); + }); } /**