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:
parent
6a5aa18a7b
commit
5a95183c3e
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue