From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:59515) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SCbZ0-0007hx-Nq for qemu-devel@nongnu.org; Tue, 27 Mar 2012 14:56:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SCbYy-00078b-V9 for qemu-devel@nongnu.org; Tue, 27 Mar 2012 14:56:14 -0400 Received: from mail-gx0-f173.google.com ([209.85.161.173]:36430) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SCbYy-00078F-Qy for qemu-devel@nongnu.org; Tue, 27 Mar 2012 14:56:12 -0400 Received: by ggnp2 with SMTP id p2so282851ggn.4 for ; Tue, 27 Mar 2012 11:56:11 -0700 (PDT) Message-ID: <4F720D47.2070304@codemonkey.ws> Date: Tue, 27 Mar 2012 13:56:07 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <1332769612-4247-1-git-send-email-afaerber@suse.de> <4F71E8AE.9030504@redhat.com> <4F71EABB.1030004@codemonkey.ws> <4F71EECE.6000307@redhat.com> In-Reply-To: <4F71EECE.6000307@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH RFC 0/3] qom: Generalize qdev init to "realize" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: qemu-devel@nongnu.org, Peter Maydell , Wanpeng Li , =?UTF-8?B?QW5kcmVhcyBGw6RyYmVy?= On 03/27/2012 11:46 AM, Paolo Bonzini wrote: > Il 27/03/2012 18:33, Peter Maydell ha scritto: >>>> Yes, I haven't reviewed this series yet, but my expectation would be that >>>> realize propagates and that the default implementation of >>>> DeviceClass::realize() would explicitly *not* propagate and instead just >>>> call ::init. >> So who calls realize for non-qdev QOM objects which are children of >> qdev QOM objects? >> >> I really don't like having the object lifecycle methods be different >> for DeviceClass than for base objects if we can avoid it. > > The way I read it was that the "realize" property propagates to the > children and calls either the "realize" or "reset" method (in the > appropriate order). Correct. We would probably want to have two methods in Object: /* realize yourself */ void realize(Error **errp); /* realize your children */ void realize_children(Error **errp); The actual realize property would call this->realize(errp); then this->realize_children(errp) modulo some cleverness to support transversal ordering. That means usually, you can just implement realize() and rely on the standard child realize support. But you could overload realize_children() if you needed to. realize_children() would propagate to child<> properties. All child<> properties trace their parentage back to the object_get_root() device. So you can realize() the entire device/object model by setting the top level realize property. > > DeviceClass::realize() would also do other things done currently by > qdev_init, such as register vmstate, Correct. I think DeviceClass::realize() should call DeviceClass::init() to start out with. Then we can refactor incrementally to move stuff from ::init() to ::realize(). Some parts of :init() will get moved to the constructor. > so there would still be a > separation between DeviceClass::realize and DeviceClass::init (we do not > want yet another pass through the whole tree). > > qdev_init would be a thin wrapper around object_realize that takes care > of freeing the object when init fails. Absolutely. Regards, Anthony Liguori > > Is this correct? > > Paolo