mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-21 02:01:38 +00:00
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 */
|
||||
_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;
|
||||
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user