From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52758) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VGpnz-0006Jd-PO for qemu-devel@nongnu.org; Tue, 03 Sep 2013 08:34:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VGpno-0006Lx-Mj for qemu-devel@nongnu.org; Tue, 03 Sep 2013 08:33:59 -0400 Received: from mail-ee0-x231.google.com ([2a00:1450:4013:c00::231]:64848) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VGpno-0006Lq-FO for qemu-devel@nongnu.org; Tue, 03 Sep 2013 08:33:48 -0400 Received: by mail-ee0-f49.google.com with SMTP id d41so2895089eek.8 for ; Tue, 03 Sep 2013 05:33:47 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Tue, 3 Sep 2013 14:32:57 +0200 Message-Id: <1378211609-16121-7-git-send-email-pbonzini@redhat.com> In-Reply-To: <1378211609-16121-1-git-send-email-pbonzini@redhat.com> References: <1378211609-16121-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 06/38] serial: reclaim memory in instance_finalize instead of exit List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: mst@redhat.com Signed-off-by: Paolo Bonzini --- hw/char/serial-pci.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c index aec6705..6dd34d3 100644 --- a/hw/char/serial-pci.c +++ b/hw/char/serial-pci.c @@ -131,6 +131,14 @@ static void serial_pci_exit(PCIDevice *dev) SerialState *s = &pci->state; serial_exit_core(s); +} + +static void serial_pci_instance_finalize(Object *obj) +{ + PCIDevice *dev = PCI_DEVICE(obj); + PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev); + SerialState *s = &pci->state; + memory_region_destroy(&s->io); } @@ -143,9 +151,22 @@ static void multi_serial_pci_exit(PCIDevice *dev) for (i = 0; i < pci->ports; i++) { s = pci->state + i; serial_exit_core(s); + } +} + +static void multi_serial_pci_instance_finalize(Object *obj) +{ + PCIDevice *dev = PCI_DEVICE(obj); + PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev); + SerialState *s; + int i; + + for (i = 0; i < pci->ports; i++) { + s = pci->state + i; memory_region_destroy(&s->io); g_free(pci->name[i]); } + memory_region_destroy(&pci->iobar); qemu_free_irqs(pci->irqs); } @@ -243,6 +264,7 @@ static const TypeInfo serial_pci_info = { .parent = TYPE_PCI_DEVICE, .instance_size = sizeof(PCISerialState), .class_init = serial_pci_class_initfn, + .instance_finalize = serial_pci_instance_finalize, }; static const TypeInfo multi_2x_serial_pci_info = { @@ -250,6 +272,7 @@ static const TypeInfo multi_2x_serial_pci_info = { .parent = TYPE_PCI_DEVICE, .instance_size = sizeof(PCIMultiSerialState), .class_init = multi_2x_serial_pci_class_initfn, + .instance_finalize = multi_serial_pci_instance_finalize, }; static const TypeInfo multi_4x_serial_pci_info = { @@ -257,6 +280,7 @@ static const TypeInfo multi_4x_serial_pci_info = { .parent = TYPE_PCI_DEVICE, .instance_size = sizeof(PCIMultiSerialState), .class_init = multi_4x_serial_pci_class_initfn, + .instance_finalize = multi_serial_pci_instance_finalize, }; static void serial_pci_register_types(void) -- 1.8.3.1