hw: faster Kernel::Signal_receiver::_listen()

ref #1096
This commit is contained in:
Martin Stein 2014-03-14 12:12:59 +01:00 committed by Norman Feske
parent 00708b6696
commit f0ac145471

View File

@ -386,22 +386,21 @@ class Kernel::Signal_receiver
{ {
while (1) while (1)
{ {
/* check if there are deliverable signal */ /* check for deliverable signals and waiting handlers */
if (_deliver.empty()) return; if (_deliver.empty() || _handlers.empty()) { return; }
Signal_context * const c = _deliver.dequeue()->object();
/* if there is no handler re-enqueue context and exit */ /* create a signal data-object */
if (_handlers.empty()) { typedef Genode::Signal_context * Signal_imprint;
_deliver.enqueue(&c->_deliver_fe); auto const context = _deliver.dequeue()->object();
return; auto const imprint =
} reinterpret_cast<Signal_imprint>(context->_imprint);
/* delivery from context to handler */ Signal::Data data(imprint, context->_submits);
Signal_handler * const h = _handlers.dequeue()->object();
Signal::Data data((Genode::Signal_context *)c->_imprint, /* communicate signal data to handler */
c->_submits); auto const handler = _handlers.dequeue()->object();
h->_receiver = 0; handler->_receiver = 0;
h->_receive_signal(&data, sizeof(data)); handler->_receive_signal(&data, sizeof(data));
c->_delivered(); context->_delivered();
} }
} }