mirror of
https://github.com/genodelabs/genode.git
synced 2025-05-02 16:52:52 +00:00
parent
ebfd6a55b3
commit
8d1e40eb5b
@ -186,11 +186,6 @@ class Kernel::Ipc_node
|
|||||||
*/
|
*/
|
||||||
virtual void _received_ipc_request(size_t const s) = 0;
|
virtual void _received_ipc_request(size_t const s) = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* IPC node started waiting for message receipt
|
|
||||||
*/
|
|
||||||
virtual void _await_ipc() = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IPC node returned from waiting due to message receipt
|
* IPC node returned from waiting due to message receipt
|
||||||
*
|
*
|
||||||
@ -256,7 +251,6 @@ class Kernel::Ipc_node
|
|||||||
/* update state */
|
/* update state */
|
||||||
if (_state != PREPARE_REPLY) { _state = AWAIT_REPLY; }
|
if (_state != PREPARE_REPLY) { _state = AWAIT_REPLY; }
|
||||||
else { _state = PREPARE_AND_AWAIT_REPLY; }
|
else { _state = PREPARE_AND_AWAIT_REPLY; }
|
||||||
_await_ipc();
|
|
||||||
|
|
||||||
/* announce request */
|
/* announce request */
|
||||||
dst->_announce_request(&_outbuf);
|
dst->_announce_request(&_outbuf);
|
||||||
@ -267,8 +261,10 @@ class Kernel::Ipc_node
|
|||||||
*
|
*
|
||||||
* \param inbuf_base base of the request buffer
|
* \param inbuf_base base of the request buffer
|
||||||
* \param inbuf_size size of the request buffer
|
* \param inbuf_size size of the request buffer
|
||||||
|
*
|
||||||
|
* \return wether a request could be received already
|
||||||
*/
|
*/
|
||||||
void await_request(void * const inbuf_base,
|
bool await_request(void * const inbuf_base,
|
||||||
size_t const inbuf_size)
|
size_t const inbuf_size)
|
||||||
{
|
{
|
||||||
/* assertions */
|
/* assertions */
|
||||||
@ -283,11 +279,11 @@ class Kernel::Ipc_node
|
|||||||
if (!_request_queue.empty()) {
|
if (!_request_queue.empty()) {
|
||||||
_receive_request(_request_queue.dequeue());
|
_receive_request(_request_queue.dequeue());
|
||||||
_received_ipc_request(_inbuf.size);
|
_received_ipc_request(_inbuf.size);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
/* no request announced, so wait */
|
/* no request announced, so wait */
|
||||||
_state = AWAIT_REQUEST;
|
_state = AWAIT_REQUEST;
|
||||||
_await_ipc();
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -85,20 +85,6 @@ void Thread::_received_ipc_request(size_t const s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Thread::_await_ipc()
|
|
||||||
{
|
|
||||||
switch (_state) {
|
|
||||||
case SCHEDULED:
|
|
||||||
_unschedule(AWAITS_IPC);
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
PWRN("wrong thread state to await IPC");
|
|
||||||
_stop();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Thread::_await_ipc_succeeded(size_t const s)
|
void Thread::_await_ipc_succeeded(size_t const s)
|
||||||
{
|
{
|
||||||
switch (_state) {
|
switch (_state) {
|
||||||
@ -432,7 +418,8 @@ void Thread::_call_await_request_msg()
|
|||||||
void * buf_base;
|
void * buf_base;
|
||||||
size_t buf_size;
|
size_t buf_size;
|
||||||
_utcb_phys->message()->info_about_await_request(buf_base, buf_size);
|
_utcb_phys->message()->info_about_await_request(buf_base, buf_size);
|
||||||
Ipc_node::await_request(buf_base, buf_size);
|
if (Ipc_node::await_request(buf_base, buf_size)) { return; }
|
||||||
|
_unschedule(AWAITS_IPC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -441,7 +428,7 @@ void Thread::_call_send_request_msg()
|
|||||||
Thread * const dst = Thread::pool()->object(user_arg_1());
|
Thread * const dst = Thread::pool()->object(user_arg_1());
|
||||||
if (!dst) {
|
if (!dst) {
|
||||||
PWRN("unknown recipient");
|
PWRN("unknown recipient");
|
||||||
_await_ipc();
|
_unschedule(AWAITS_IPC);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void * msg_base;
|
void * msg_base;
|
||||||
@ -452,6 +439,7 @@ void Thread::_call_send_request_msg()
|
|||||||
buf_base, buf_size);
|
buf_base, buf_size);
|
||||||
Ipc_node::send_request_await_reply(dst, msg_base, msg_size,
|
Ipc_node::send_request_await_reply(dst, msg_base, msg_size,
|
||||||
buf_base, buf_size);
|
buf_base, buf_size);
|
||||||
|
_unschedule(AWAITS_IPC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -281,7 +281,6 @@ class Kernel::Thread
|
|||||||
**************/
|
**************/
|
||||||
|
|
||||||
void _received_ipc_request(size_t const s);
|
void _received_ipc_request(size_t const s);
|
||||||
void _await_ipc();
|
|
||||||
void _await_ipc_succeeded(size_t const s);
|
void _await_ipc_succeeded(size_t const s);
|
||||||
void _await_ipc_failed();
|
void _await_ipc_failed();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user