mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-21 18:06:50 +00:00
parent
e856158824
commit
9f95784f02
@ -104,7 +104,7 @@ class Kernel::Ipc_node
|
|||||||
/* update state */
|
/* update state */
|
||||||
if (_state != PREPARE_AND_AWAIT_REPLY) { _state = INACTIVE; }
|
if (_state != PREPARE_AND_AWAIT_REPLY) { _state = INACTIVE; }
|
||||||
else { _state = PREPARE_REPLY; }
|
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 */
|
/* directly receive request if we've awaited it */
|
||||||
if (_state == AWAIT_REQUEST) {
|
if (_state == AWAIT_REQUEST) {
|
||||||
_receive_request(r);
|
_receive_request(r);
|
||||||
_await_ipc_succeeded();
|
_await_request_succeeded();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* cannot receive yet, so queue request */
|
/* cannot receive yet, so queue request */
|
||||||
@ -177,19 +177,29 @@ class Kernel::Ipc_node
|
|||||||
_outbuf_dst = 0;
|
_outbuf_dst = 0;
|
||||||
if (!_inbuf.src) { _state = INACTIVE; }
|
if (!_inbuf.src) { _state = INACTIVE; }
|
||||||
else { _state = PREPARE_REPLY; }
|
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:
|
protected:
|
||||||
|
|
||||||
@ -312,16 +322,16 @@ class Kernel::Ipc_node
|
|||||||
case AWAIT_REPLY:
|
case AWAIT_REPLY:
|
||||||
_cancel_outbuf_request();
|
_cancel_outbuf_request();
|
||||||
_state = INACTIVE;
|
_state = INACTIVE;
|
||||||
_await_ipc_failed();
|
_send_request_failed();
|
||||||
return;
|
return;
|
||||||
case AWAIT_REQUEST:
|
case AWAIT_REQUEST:
|
||||||
_state = INACTIVE;
|
_state = INACTIVE;
|
||||||
_await_ipc_failed();
|
_await_request_failed();
|
||||||
return;
|
return;
|
||||||
case PREPARE_AND_AWAIT_REPLY:
|
case PREPARE_AND_AWAIT_REPLY:
|
||||||
_cancel_outbuf_request();
|
_cancel_outbuf_request();
|
||||||
_state = PREPARE_REPLY;
|
_state = PREPARE_REPLY;
|
||||||
_await_ipc_failed();
|
_send_request_failed();
|
||||||
return;
|
return;
|
||||||
default: 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) {
|
assert(_state == AWAITS_IPC);
|
||||||
case AWAITS_IPC:
|
user_arg_0(0);
|
||||||
user_arg_0(0);
|
_schedule();
|
||||||
_schedule();
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
PWRN("wrong thread state to receive IPC");
|
|
||||||
_stop();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Thread::_await_ipc_failed()
|
void Thread::_send_request_failed()
|
||||||
{
|
{
|
||||||
switch (_state) {
|
assert(_state == AWAITS_IPC);
|
||||||
case AWAITS_IPC:
|
user_arg_0(-1);
|
||||||
user_arg_0(-1);
|
_schedule();
|
||||||
_schedule();
|
}
|
||||||
return;
|
|
||||||
default:
|
|
||||||
PWRN("wrong thread state to cancel IPC");
|
void Thread::_await_request_succeeded()
|
||||||
_stop();
|
{
|
||||||
return;
|
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 **
|
** Ipc_node **
|
||||||
**************/
|
**************/
|
||||||
|
|
||||||
void _await_ipc_succeeded();
|
void _send_request_succeeded();
|
||||||
void _await_ipc_failed();
|
void _send_request_failed();
|
||||||
|
void _await_request_succeeded();
|
||||||
|
void _await_request_failed();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user