platform_drv: dissolve shared irq session

Fix genodelabs/genode#4912
This commit is contained in:
Stefan Kalkowski 2023-05-30 16:10:29 +02:00 committed by Christian Helmuth
parent 2dbf3322d8
commit 5253d4ddd7
2 changed files with 12 additions and 4 deletions

View File

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

View File

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