From 09e96dfdcd9a2331ade94da89eb4da3e2eedd5c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Thu, 2 Apr 2015 14:52:36 +0200 Subject: [PATCH] dde_kit: use async IRQ session interface Up to now, dde_kit used the synchronous IRQ session interface. This interface is going to get deprectated very soon. Issue #1456. --- repos/os/src/lib/dde_kit/interrupt.cc | 33 ++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/repos/os/src/lib/dde_kit/interrupt.cc b/repos/os/src/lib/dde_kit/interrupt.cc index a9339e0be..d93b14dde 100644 --- a/repos/os/src/lib/dde_kit/interrupt.cc +++ b/repos/os/src/lib/dde_kit/interrupt.cc @@ -54,6 +54,9 @@ class Irq_handler : Dde_kit::Thread, public Avl_node int _handle_irq; /* nested irq disable counter */ Lock _lock; /* synchronize access to counter */ + Genode::Signal_receiver _sig_rec; + Genode::Signal_dispatcher _irq_dispatcher; + const char * _compose_thread_name(unsigned irq) { @@ -61,6 +64,16 @@ class Irq_handler : Dde_kit::Thread, public Avl_node return _thread_name; } + void _handle(unsigned) + { + _irq.ack_irq(); + + /* only call registered handler function, if IRQ is not disabled */ + _lock.lock(); + if (_handle_irq) _handler(_priv); + _lock.unlock(); + } + public: Irq_handler(unsigned irq, void (*handler)(void *), void *priv, @@ -68,12 +81,18 @@ class Irq_handler : Dde_kit::Thread, public Avl_node : Dde_kit::Thread(_compose_thread_name(irq)), _irq_number(irq), _irq(irq), _handler(handler), _init(init), _priv(priv), - _shared(shared), _handle_irq(1), _lock(Lock::LOCKED) + _shared(shared), _handle_irq(1), _lock(Lock::LOCKED), + _irq_dispatcher(_sig_rec, *this, &Irq_handler::_handle) { + _irq.sigh(_irq_dispatcher); + start(); /* wait until thread is started */ Lock::Guard guard(_lock); + + /* initial ack so that we will receive further interrupts */ + _irq.ack_irq(); } /** Enable IRQ handling */ @@ -102,12 +121,14 @@ class Irq_handler : Dde_kit::Thread, public Avl_node _lock.unlock(); while (1) { - _irq.wait_for_irq(); + using namespace Genode; - /* only call registered handler function, if IRQ is not disabled */ - _lock.lock(); - if (_handle_irq) _handler(_priv); - _lock.unlock(); + Signal sig = _sig_rec.wait_for_signal(); + int num = sig.num(); + + Signal_dispatcher_base *dispatcher; + dispatcher = dynamic_cast(sig.context()); + dispatcher->dispatch(num); } }