On Tue, 17 Sep 2024, Matheus Tavares Bernardino wrote:
At e72a7f65c1 (hw: Move declaration of IRQState to header and add init
function, 2024-06-29), we've changed qemu_allocate_irq() to use a
combination of g_new() + object_initialize() instead of
IRQ(object_new()). The latter sets obj->free, so that that the memory is
properly cleaned when the object is finalized, but the former doesn't.

Signed-off-by: Matheus Tavares Bernardino <quic_mathb...@quicinc.com>

Sorry for breaking it, I did not know about that feature of object_new. Thanks for fixing it.

Reviewed-by: BALATON Zoltan <bala...@eik.bme.hu>
Fixes: e72a7f65c1 (hw: Move declaration of IRQState to header and add init 
function)

Regards,
BALATON Zoltan

---
hw/core/irq.c | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/hw/core/irq.c b/hw/core/irq.c
index db95ffc18f..7d80de1ca6 100644
--- a/hw/core/irq.c
+++ b/hw/core/irq.c
@@ -34,13 +34,19 @@ void qemu_set_irq(qemu_irq irq, int level)
    irq->handler(irq->opaque, irq->n, level);
}

+static void qemu_init_irq_fields(IRQState *irq, qemu_irq_handler handler,
+                                 void *opaque, int n)
+{
+    irq->handler = handler;
+    irq->opaque = opaque;
+    irq->n = n;
+}
+
void qemu_init_irq(IRQState *irq, qemu_irq_handler handler, void *opaque,
                   int n)
{
    object_initialize(irq, sizeof(*irq), TYPE_IRQ);
-    irq->handler = handler;
-    irq->opaque = opaque;
-    irq->n = n;
+    qemu_init_irq_fields(irq, handler, opaque, n);
}

qemu_irq *qemu_extend_irqs(qemu_irq *old, int n_old, qemu_irq_handler handler,
@@ -66,11 +72,8 @@ qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void 
*opaque, int n)

qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque, int n)
{
-    IRQState *irq;
-
-    irq = g_new(IRQState, 1);
-    qemu_init_irq(irq, handler, opaque, n);
-
+    IRQState *irq = IRQ(object_new(TYPE_IRQ));
+    qemu_init_irq_fields(irq, handler, opaque, n);
    return irq;
}



Reply via email to