base-hw: avoid that Ipc_node inherits

Besides simplifying inheritance hierarchies in base-hw, this prepares for the
in-place translation of the synchronous-IPC module to Ada in the context of the
Spunky project.

Ref #3308
This commit is contained in:
Martin Stein 2019-04-20 02:44:59 +02:00 committed by Christian Helmuth
parent 6a5aa18a7b
commit 5a95183c3e
2 changed files with 24 additions and 26 deletions

View File

@ -52,14 +52,16 @@ void Ipc_node::_announce_request(Ipc_node &node)
} }
/* cannot receive yet, so queue request */ /* cannot receive yet, so queue request */
_request_queue.enqueue(node); _request_queue.enqueue(node._request_queue_item);
} }
void Ipc_node::_cancel_request_queue() void Ipc_node::_cancel_request_queue()
{ {
_request_queue.dequeue_all([] (Ipc_node &node) { _request_queue.dequeue_all([] (Queue_item &item) {
node._outbuf_request_cancelled(); }); 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) void Ipc_node::_announced_request_cancelled(Ipc_node &node)
{ {
if (_caller == &node) _caller = nullptr; 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; _state = AWAIT_REQUEST;
/* if anybody already announced a request receive it */ /* if anybody already announced a request receive it */
_request_queue.dequeue([&] (Ipc_node &ipc) { _request_queue.dequeue([&] (Queue_item &item) {
_receive_request(ipc); _receive_request(item.object());
announced = true; announced = true;
}); });
return announced; return announced;

View File

@ -18,8 +18,6 @@
/* Genode includes */ /* Genode includes */
#include <util/fifo.h> #include <util/fifo.h>
namespace Genode { class Msgbuf_base; };
namespace Kernel namespace Kernel
{ {
class Thread; class Thread;
@ -28,13 +26,14 @@ namespace Kernel
* Backend for end points of synchronous interprocess communication * Backend for end points of synchronous interprocess communication
*/ */
class Ipc_node; class Ipc_node;
using Ipc_node_queue = Genode::Fifo<Ipc_node>;
} }
class Kernel::Ipc_node : private Ipc_node_queue::Element class Kernel::Ipc_node
{ {
protected: private:
using Queue_item = Genode::Fifo_element<Ipc_node>;
using Queue = Genode::Fifo<Queue_item>;
enum State enum State
{ {
@ -43,18 +42,13 @@ class Kernel::Ipc_node : private Ipc_node_queue::Element
AWAIT_REQUEST = 3, AWAIT_REQUEST = 3,
}; };
Thread &_thread;
private: Queue_item _request_queue_item { *this };
State _state { INACTIVE };
friend class Core_thread; Ipc_node *_caller { nullptr };
friend class Genode::Fifo<Ipc_node>; Ipc_node *_callee { nullptr };
bool _help { false };
Thread &_thread; Queue _request_queue { };
State _state { INACTIVE };
Ipc_node * _caller { nullptr };
Ipc_node * _callee { nullptr };
bool _help { false };
Ipc_node_queue _request_queue { };
/** /**
* Buffer next request from request queue in 'r' to handle it * 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); if (_caller && _caller->_help) f(*_caller);
/* call 'f' for each helper in our request queue */ /* call 'f' for each helper in our request queue */
_request_queue.for_each([f] (Ipc_node &node) { _request_queue.for_each([f] (Queue_item &item) {
if (node._help) f(node); }); Ipc_node &node { item.object() };
if (node._help) f(node);
});
} }
/** /**