From f0ac145471ed7b1d2dc1951e578182d03e914a17 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Fri, 14 Mar 2014 12:12:59 +0100 Subject: [PATCH] hw: faster Kernel::Signal_receiver::_listen() ref #1096 --- base-hw/src/core/kernel/signal_receiver.h | 29 +++++++++++------------ 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/base-hw/src/core/kernel/signal_receiver.h b/base-hw/src/core/kernel/signal_receiver.h index 2aad2696b..54a05596b 100644 --- a/base-hw/src/core/kernel/signal_receiver.h +++ b/base-hw/src/core/kernel/signal_receiver.h @@ -386,22 +386,21 @@ class Kernel::Signal_receiver { while (1) { - /* check if there are deliverable signal */ - if (_deliver.empty()) return; - Signal_context * const c = _deliver.dequeue()->object(); + /* check for deliverable signals and waiting handlers */ + if (_deliver.empty() || _handlers.empty()) { return; } - /* if there is no handler re-enqueue context and exit */ - if (_handlers.empty()) { - _deliver.enqueue(&c->_deliver_fe); - return; - } - /* delivery from context to handler */ - Signal_handler * const h = _handlers.dequeue()->object(); - Signal::Data data((Genode::Signal_context *)c->_imprint, - c->_submits); - h->_receiver = 0; - h->_receive_signal(&data, sizeof(data)); - c->_delivered(); + /* create a signal data-object */ + typedef Genode::Signal_context * Signal_imprint; + auto const context = _deliver.dequeue()->object(); + auto const imprint = + reinterpret_cast(context->_imprint); + Signal::Data data(imprint, context->_submits); + + /* communicate signal data to handler */ + auto const handler = _handlers.dequeue()->object(); + handler->_receiver = 0; + handler->_receive_signal(&data, sizeof(data)); + context->_delivered(); } }