From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58098) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wuj62-0001zF-3j for qemu-devel@nongnu.org; Wed, 11 Jun 2014 10:01:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wuj5r-0005Ys-Ah for qemu-devel@nongnu.org; Wed, 11 Jun 2014 10:01:46 -0400 Received: from mx1.redhat.com ([209.132.183.28]:3800) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wuj5r-0005Ye-3D for qemu-devel@nongnu.org; Wed, 11 Jun 2014 10:01:35 -0400 Message-ID: <53986133.1070904@redhat.com> Date: Wed, 11 Jun 2014 16:01:23 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1402489176-19738-1-git-send-email-pbonzini@redhat.com> <1402489176-19738-4-git-send-email-pbonzini@redhat.com> In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH 03/13] qom: move unparenting to the child property's release callback List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Crosthwaite Cc: "qemu-devel@nongnu.org Developers" , =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= Il 11/06/2014 15:35, Peter Crosthwaite ha scritto: > On Wed, Jun 11, 2014 at 10:19 PM, Paolo Bonzini wrote: >> This ensures that the unparent callback is called automatically >> when the parent object is finalized. >> >> Note that there's no need to keep a reference neither in >> object_unparent nor in object_finalize_child_property. The >> reference held by the child property itself will do. >> >> Signed-off-by: Paolo Bonzini >> --- >> qom/object.c | 14 ++++---------- >> 1 file changed, 4 insertions(+), 10 deletions(-) >> >> diff --git a/qom/object.c b/qom/object.c >> index 01087e5..69a95d6 100644 >> --- a/qom/object.c >> +++ b/qom/object.c >> @@ -386,19 +386,9 @@ static void object_property_del_child(Object *obj, Object *child, Error **errp) >> >> void object_unparent(Object *obj) >> { >> - if (!obj->parent) { >> - return; >> - } >> - >> - object_ref(obj); >> - if (obj->class->unparent) { >> - (obj->class->unparent)(obj); >> - } > > This changes this publicly visible API significantly, in that unparent > from the childs point-of-view is now invisible in cases where you are > doing a standalone object_unparent() call. > > I'm not sure why parent finalisation is the only occasion on which a > genuine and complete unparenting is allowed? I think this API should > remain complete should a QOM user wish to re-arrange child > relationships seperate from any finalisations. No, this is moved to object_finalize_child_property, i.e. the release callback of child<> properties. object_property_del_child calls it. The change is that, before, the unparent callback was only invoked if you explicitly called object_unparent. Now it's always called as part of finalize, even if you unparent the outer object but not the inner ones. I find it more intuitive. Note that this is not yet needed in these 13 patches. Paolo >> if (obj->parent) { >> object_property_del_child(obj->parent, obj, NULL); >> - obj->parent = NULL; >> } >> - object_unref(obj); >> } >> >> static void object_deinit(Object *obj, TypeImpl *type) >> @@ -1017,6 +1007,10 @@ static void object_finalize_child_property(Object *obj, const char *name, >> { >> Object *child = opaque; >> >> + if (child->class->unparent) { >> + (child->class->unparent)(child); >> + } >> + child->parent = NULL; > > Can you just leave object_unparent() mostly as-is and call it from > here? It's already guarded against repeated calls should there be > users calling it manually before parent finalisations. > > Regards, > Peter > >> object_unref(child); >> } >> >> -- >> 1.8.3.1 >> >> >>