diff --git a/repos/os/src/drivers/platform/device_component.cc b/repos/os/src/drivers/platform/device_component.cc index 2746099318..ada0187cf6 100644 --- a/repos/os/src/drivers/platform/device_component.cc +++ b/repos/os/src/drivers/platform/device_component.cc @@ -119,8 +119,8 @@ Genode::Irq_session_capability Device_component::irq(unsigned idx) if (irq.shared && !irq.sirq.constructed()) _device_model.with_shared_irq(irq.number, [&] (Shared_interrupt & sirq) { - irq.sirq.construct(sirq, irq.mode, irq.polarity); - _env.ep().rpc_ep().manage(&*irq.sirq); + irq.sirq.construct(_env.ep().rpc_ep(), sirq, + irq.mode, irq.polarity); }); cap = irq.shared ? irq.sirq->cap() : irq.irq->cap(); diff --git a/repos/os/src/drivers/platform/shared_irq.h b/repos/os/src/drivers/platform/shared_irq.h index b7198a01d7..e4ee761cf5 100644 --- a/repos/os/src/drivers/platform/shared_irq.h +++ b/repos/os/src/drivers/platform/shared_irq.h @@ -67,23 +67,31 @@ class Driver::Shared_interrupt_session : { private: + Rpc_entrypoint & _ep; Shared_interrupt & _sirq; Signal_context_capability _cap {}; bool _outstanding { true }; public: - Shared_interrupt_session(Shared_interrupt & sirq, + Shared_interrupt_session(Rpc_entrypoint &ep, + Shared_interrupt &sirq, Irq_session::Trigger mode, Irq_session::Polarity polarity) : Registry::Element(sirq._sessions, *this), + _ep(ep), _sirq(sirq) { sirq.enable(mode, polarity); + _ep.manage(this); } - ~Shared_interrupt_session() { _sirq.disable(); } + ~Shared_interrupt_session() + { + _ep.dissolve(this); + _sirq.disable(); + } bool outstanding() { return _outstanding; } void signal();