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 */
_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;

View File

@ -18,8 +18,6 @@
/* Genode includes */
#include <util/fifo.h>
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<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
{
@ -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<Ipc_node>;
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);
});
}
/**