mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-20 17:52:52 +00:00
parent
e856158824
commit
9f95784f02
@ -104,7 +104,7 @@ class Kernel::Ipc_node
|
||||
/* update state */
|
||||
if (_state != PREPARE_AND_AWAIT_REPLY) { _state = INACTIVE; }
|
||||
else { _state = PREPARE_REPLY; }
|
||||
_await_ipc_succeeded();
|
||||
_send_request_succeeded();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,7 +115,7 @@ class Kernel::Ipc_node
|
||||
/* directly receive request if we've awaited it */
|
||||
if (_state == AWAIT_REQUEST) {
|
||||
_receive_request(r);
|
||||
_await_ipc_succeeded();
|
||||
_await_request_succeeded();
|
||||
return;
|
||||
}
|
||||
/* cannot receive yet, so queue request */
|
||||
@ -177,19 +177,29 @@ class Kernel::Ipc_node
|
||||
_outbuf_dst = 0;
|
||||
if (!_inbuf.src) { _state = INACTIVE; }
|
||||
else { _state = PREPARE_REPLY; }
|
||||
_await_ipc_failed();
|
||||
_send_request_failed();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* IPC node returned from waiting due to message receipt
|
||||
* IPC node returned from waiting due to reply receipt
|
||||
*/
|
||||
virtual void _await_ipc_succeeded() = 0;
|
||||
virtual void _send_request_succeeded() = 0;
|
||||
|
||||
/**
|
||||
* IPC node returned from waiting due to cancellation
|
||||
* IPC node returned from waiting due to reply cancellation
|
||||
*/
|
||||
virtual void _await_ipc_failed() = 0;
|
||||
virtual void _send_request_failed() = 0;
|
||||
|
||||
/**
|
||||
* IPC node returned from waiting due to request receipt
|
||||
*/
|
||||
virtual void _await_request_succeeded() = 0;
|
||||
|
||||
/**
|
||||
* IPC node returned from waiting due to request cancellation
|
||||
*/
|
||||
virtual void _await_request_failed() = 0;
|
||||
|
||||
protected:
|
||||
|
||||
@ -312,16 +322,16 @@ class Kernel::Ipc_node
|
||||
case AWAIT_REPLY:
|
||||
_cancel_outbuf_request();
|
||||
_state = INACTIVE;
|
||||
_await_ipc_failed();
|
||||
_send_request_failed();
|
||||
return;
|
||||
case AWAIT_REQUEST:
|
||||
_state = INACTIVE;
|
||||
_await_ipc_failed();
|
||||
_await_request_failed();
|
||||
return;
|
||||
case PREPARE_AND_AWAIT_REPLY:
|
||||
_cancel_outbuf_request();
|
||||
_state = PREPARE_REPLY;
|
||||
_await_ipc_failed();
|
||||
_send_request_failed();
|
||||
return;
|
||||
default: return;
|
||||
}
|
||||
|
@ -71,33 +71,35 @@ void Thread::_receive_signal(void * const base, size_t const size)
|
||||
}
|
||||
|
||||
|
||||
void Thread::_await_ipc_succeeded()
|
||||
void Thread::_send_request_succeeded()
|
||||
{
|
||||
switch (_state) {
|
||||
case AWAITS_IPC:
|
||||
user_arg_0(0);
|
||||
_schedule();
|
||||
return;
|
||||
default:
|
||||
PWRN("wrong thread state to receive IPC");
|
||||
_stop();
|
||||
return;
|
||||
}
|
||||
assert(_state == AWAITS_IPC);
|
||||
user_arg_0(0);
|
||||
_schedule();
|
||||
}
|
||||
|
||||
|
||||
void Thread::_await_ipc_failed()
|
||||
void Thread::_send_request_failed()
|
||||
{
|
||||
switch (_state) {
|
||||
case AWAITS_IPC:
|
||||
user_arg_0(-1);
|
||||
_schedule();
|
||||
return;
|
||||
default:
|
||||
PWRN("wrong thread state to cancel IPC");
|
||||
_stop();
|
||||
return;
|
||||
}
|
||||
assert(_state == AWAITS_IPC);
|
||||
user_arg_0(-1);
|
||||
_schedule();
|
||||
}
|
||||
|
||||
|
||||
void Thread::_await_request_succeeded()
|
||||
{
|
||||
assert(_state == AWAITS_IPC);
|
||||
user_arg_0(0);
|
||||
_schedule();
|
||||
}
|
||||
|
||||
|
||||
void Thread::_await_request_failed()
|
||||
{
|
||||
assert(_state == AWAITS_IPC);
|
||||
user_arg_0(-1);
|
||||
_schedule();
|
||||
}
|
||||
|
||||
|
||||
|
@ -280,8 +280,10 @@ class Kernel::Thread
|
||||
** Ipc_node **
|
||||
**************/
|
||||
|
||||
void _await_ipc_succeeded();
|
||||
void _await_ipc_failed();
|
||||
void _send_request_succeeded();
|
||||
void _send_request_failed();
|
||||
void _await_request_succeeded();
|
||||
void _await_request_failed();
|
||||
|
||||
public:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user