hw: diversify feedback from IPC node to thread

ref #1108
This commit is contained in:
Martin Stein 2014-04-04 13:41:04 +02:00 committed by Norman Feske
parent e856158824
commit 9f95784f02
3 changed files with 48 additions and 34 deletions

View File

@ -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;
} }

View File

@ -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();
} }

View File

@ -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: