From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56453) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YjADv-0001C4-P2 for qemu-devel@nongnu.org; Fri, 17 Apr 2015 13:38:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YjADt-0006LG-EW for qemu-devel@nongnu.org; Fri, 17 Apr 2015 13:38:39 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39816) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YjADt-0006LC-9G for qemu-devel@nongnu.org; Fri, 17 Apr 2015 13:38:37 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id B41B8A0E7A for ; Fri, 17 Apr 2015 17:38:36 +0000 (UTC) Date: Fri, 17 Apr 2015 18:38:32 +0100 From: "Daniel P. Berrange" Message-ID: <20150417173832.GA18365@redhat.com> References: <1429280557-8887-1-git-send-email-berrange@redhat.com> <1429280557-8887-26-git-send-email-berrange@redhat.com> <553123CA.2090408@redhat.com> <20150417154955.GJ23619@redhat.com> <55312D64.4080307@redhat.com> <20150417161158.GL23619@redhat.com> <55313D7C.8030804@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <55313D7C.8030804@redhat.com> Subject: Re: [Qemu-devel] [PATCH v1 RFC 25/34] io: add QIOTask class for async operations Reply-To: "Daniel P. Berrange" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: qemu-devel@nongnu.org, Stefan Hajnoczi , Gerd Hoffmann On Fri, Apr 17, 2015 at 07:06:04PM +0200, Paolo Bonzini wrote: > > > On 17/04/2015 18:11, Daniel P. Berrange wrote: > > > > + task = qio_task_new(OBJECT(ioc), > > + func, opaque, destroy); > > + > > + qio_channel_tls_handshake_task(ioc, task); > > + > > + object_unref(OBJECT(task)); > > > > The second ref taken at time of qio_channel_add_watch_full() gets released > > by the GDestroyNotify that is passed to that method. > > /me is blind. > > So this means you really do not need the reference counting; > qio_channel_tls_handshake_task (which is static anyway) is what manages > the lifetime of the QIOTask, it can take ownership of the task right > after it is created. > > In effect QIOTask is just wrapping the (func, opaque, destroy) > continuation. It makes sense that it doesn't need reference counting, > because it has a well-defined point of death (just before the > continuation is called, or just before you find out it will never be > called). So I think it's okay to remove the reference counting and make > it a simple heap-allocated struct. gio_channel_tls_handshake_task can > free it after calling gio_task_{abort,complete}. > > Without the reference counting the GDestroyNotify also becomes > unnecessary (and the fact that you're using QIOTask as a simple > continuation explains why you didn't need GDestroyNotify), but it's okay > if you want to leave it in. > > I would also have QIOTaskFunc take the "exploded" struct, i.e. typedef > void QIOTaskFunc(QMyObject *, gpointer, Error *), and hide QIOTask > entirely from the user. Yeah, I can try that approach and see how it works out. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|