From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:32878) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SPXmv-0003tF-TC for qemu-devel@nongnu.org; Wed, 02 May 2012 07:32:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SPXmt-0000L9-Vm for qemu-devel@nongnu.org; Wed, 02 May 2012 07:32:05 -0400 Received: from mail-yw0-f45.google.com ([209.85.213.45]:40733) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SPXmt-0000HC-Pi for qemu-devel@nongnu.org; Wed, 02 May 2012 07:32:03 -0400 Received: by mail-yw0-f45.google.com with SMTP id o21so684631yho.4 for ; Wed, 02 May 2012 04:32:03 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Wed, 2 May 2012 13:31:02 +0200 Message-Id: <1335958273-769-11-git-send-email-pbonzini@redhat.com> In-Reply-To: <1335958273-769-1-git-send-email-pbonzini@redhat.com> References: <1335958273-769-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 10/21] qdev: do not propagate properties to subclasses List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, aliguori@us.ibm.com, liwp@linux.vnet.ibm.com, afaerber@suse.de As soon as we'll look up properties along the inheritance chain, we will have duplicates if class A defines some properties and its subclass B does not define any, because class_b->props will be left equal to class_a->props. The solution here is to reintroduce the class_base_init TypeInfo callback, that was present in one of the early QOM versions but removed (on my request...) before committing. Signed-off-by: Paolo Bonzini --- hw/qdev.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/qdev.c b/hw/qdev.c index 94fb32e..67d7770 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -658,6 +658,16 @@ static void device_finalize(Object *obj) QTAILQ_REMOVE(&dev->parent_bus->children, dev, sibling); } +static void device_class_base_init(ObjectClass *class, void *data) +{ + DeviceClass *klass = DEVICE_CLASS(class); + + /* We explicitly look up properties in the superclasses, + * so do not propagate them to the subclasses. + */ + klass->props = NULL; +} + void device_reset(DeviceState *dev) { DeviceClass *klass = DEVICE_GET_CLASS(dev); @@ -684,6 +694,7 @@ static TypeInfo device_type_info = { .instance_size = sizeof(DeviceState), .instance_init = device_initfn, .instance_finalize = device_finalize, + .class_base_init = device_class_base_init, .abstract = true, .class_size = sizeof(DeviceClass), }; -- 1.7.9.3