From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:36344) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Senf0-0007oQ-Oq for qemu-devel@nongnu.org; Wed, 13 Jun 2012 09:31:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Seneu-0000Z8-9T for qemu-devel@nongnu.org; Wed, 13 Jun 2012 09:30:58 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:47911) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Senet-0000Yk-Ui for qemu-devel@nongnu.org; Wed, 13 Jun 2012 09:30:52 -0400 Received: by pbbro12 with SMTP id ro12so2399553pbb.4 for ; Wed, 13 Jun 2012 06:30:50 -0700 (PDT) Message-ID: <4FD89604.7050606@codemonkey.ws> Date: Wed, 13 Jun 2012 08:30:44 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <76ad34dd30a83d96a97bc7443245ee9c165e053f.1339578989.git.peter.crosthwaite@petalogix.com> <4FD8658C.700@redhat.com> <4FD86B35.90000@suse.de> <4FD86EAA.1060005@redhat.com> <4FD88E95.8060806@suse.de> <4FD88F4B.20603@redhat.com> In-Reply-To: <4FD88F4B.20603@redhat.com> Content-Type: multipart/mixed; boundary="------------050508060109090200070600" Subject: Re: [Qemu-devel] [RFC v0 5/8] object: make interfaces concrete List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: peter.maydell@linaro.org, aliguori@us.ibm.com, qemu-devel@nongnu.org, "Peter A. G. Crosthwaite" , paul@codesourcery.com, edgar.iglesias@gmail.com, =?ISO-8859-15?Q?Andreas_F=E4rber?= , john.williams@petalogix.com, avi@redhat.com This is a multi-part message in MIME format. --------------050508060109090200070600 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 8bit On 06/13/2012 08:02 AM, Paolo Bonzini wrote: > Il 13/06/2012 14:59, Andreas Färber ha scritto: >> Ouch! One can argue that's still not recursive, but what matters more >> this borks Anthony's in-place object_initialize() concept. >> >> Two solutions come to mind: >> * allocate the interfaces as part of object_new() beyond instance_size > > That won't work if you initialize in place, because you cannot allocate > the room for the interface. It is possible to put Interface objects > explicitly in the class, and pass an offset when registering the type so > that they can be initialized in place. > > But I still think we're fighting windmills... There's no problem in my mind with allocating interfaces on the heap. in-place initialization is a readability thing, it's not a memory management thing. It's so you can see that: struct PIIX3 { ... RTCState rtc; APICState *apic; }; 'rtc' is a child and 'apic' is a link. Anyway, I don't like the idea of making interfaces concrete. That means that a user could directly instantiate an interface which doesn't make a lot of sense. Here's a different solution. This has not been even compile tested but I think the concept is sound. Regards, Anthony Liguori > > Paolo > > --------------050508060109090200070600 Content-Type: text/x-patch; name="0001-qom-allow-interfaces-to-be-created-while-abstract-du.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-qom-allow-interfaces-to-be-created-while-abstract-du.pa"; filename*1="tch" >>From c7e0661bd261ac4919dca0e3a5dd78d3871c3292 Mon Sep 17 00:00:00 2001 From: Anthony Liguori Date: Wed, 13 Jun 2012 08:29:30 -0500 Subject: [PATCH] qom: allow interfaces to be created while abstract during object initialization Signed-off-by: Anthony Liguori --- qom/object.c | 23 ++++++++++++++++++----- 1 files changed, 18 insertions(+), 5 deletions(-) diff --git a/qom/object.c b/qom/object.c index 6f839ad..1a436d8 100644 --- a/qom/object.c +++ b/qom/object.c @@ -73,6 +73,8 @@ typedef struct Interface static Type type_interface; +static Object *object_new_with_type_full(Type type, bool concrete_only); + static GHashTable *type_table_get(void) { static GHashTable *type_table; @@ -250,7 +252,7 @@ static void object_interface_init(Object *obj, InterfaceImpl *iface) TypeImpl *ti = iface->type; Interface *iface_obj; - iface_obj = INTERFACE(object_new(ti->name)); + iface_obj = INTERFACE(object_new_with_type_full(ti, false)); iface_obj->obj = obj; obj->interfaces = g_slist_prepend(obj->interfaces, iface_obj); @@ -273,7 +275,8 @@ static void object_init_with_type(Object *obj, TypeImpl *ti) } } -void object_initialize_with_type(void *data, TypeImpl *type) +static void object_initialize_with_type_full(void *data, TypeImpl *type, + bool concrete_only) { Object *obj = data; @@ -281,7 +284,7 @@ void object_initialize_with_type(void *data, TypeImpl *type) type_initialize(type); g_assert(type->instance_size >= sizeof(Object)); - g_assert(type->abstract == false); + g_assert(!concrete_only || type->abstract == false); memset(obj, 0, type->instance_size); obj->class = type->class; @@ -289,6 +292,11 @@ void object_initialize_with_type(void *data, TypeImpl *type) object_init_with_type(obj, type); } +void object_initialize_with_type(void *data, TypeImpl *type) +{ + object_initialize_with_type_full(data, type, false); +} + void object_initialize(void *data, const char *typename) { TypeImpl *type = type_get_by_name(typename); @@ -362,7 +370,7 @@ void object_finalize(void *data) g_assert(obj->ref == 0); } -Object *object_new_with_type(Type type) +static Object *object_new_with_type_full(Type type, bool concrete_only) { Object *obj; @@ -370,12 +378,17 @@ Object *object_new_with_type(Type type) type_initialize(type); obj = g_malloc(type->instance_size); - object_initialize_with_type(obj, type); + object_initialize_with_type_full(obj, type, concrete_only); object_ref(obj); return obj; } +Object *object_new_with_type(Type type) +{ + return object_new_with_type_full(type, true); +} + Object *object_new(const char *typename) { TypeImpl *ti = type_get_by_name(typename); -- 1.7.5.4 --------------050508060109090200070600--