From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=47909 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PwxEg-0006nW-2V for qemu-devel@nongnu.org; Tue, 08 Mar 2011 08:46:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PwxEe-00022H-PB for qemu-devel@nongnu.org; Tue, 08 Mar 2011 08:46:01 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54320) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PwxEe-000225-GS for qemu-devel@nongnu.org; Tue, 08 Mar 2011 08:46:00 -0500 Message-ID: <4D763311.5030905@redhat.com> Date: Tue, 08 Mar 2011 15:45:53 +0200 From: Avi Kivity MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 00/22] QAPI Round 1 References: <1299460984-15849-1-git-send-email-aliguori@us.ibm.com> <4D7500C8.1080101@codemonkey.ws> <4D760F2B.7030004@redhat.com> <4D7630BA.4010609@us.ibm.com> In-Reply-To: <4D7630BA.4010609@us.ibm.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Stefan Hajnoczi , Luiz Capitulino , qemu-devel@nongnu.org, Markus Armbruster , Adam Litke On 03/08/2011 03:35 PM, Anthony Liguori wrote: > On 03/08/2011 05:12 AM, Avi Kivity wrote: >> On 03/07/2011 05:59 PM, Anthony Liguori wrote: >>> >>>> How do async commands work? You mentioned them when talking about >>>> QAPI but it's not obvious to me that there is any "native" support for >>>> async commands? >>> >>> Async commands are interesting.. >> >> Would there be anything in them other than starting each command in >> its own thread? If it then drops the right locks it can execute in >> parallel with other commands, if it doesn't, then it's synchronous >> (and presumably doesn't depend on external or guest events). > > I've implemented them (for virt-agent) and I'll have it in v2 of round 1. > > I use callbacks. If a function is marked to be async, it generates a > signature like: > > typedef void (GuestViewFileCompletionFunc)(void *qmp__opaque, const > char * qmp__retval, Error *qmp__err); > void qmp_guest_view_file(const char * filename, Error **err, > GuestViewFileCompletionFunc *qmp__cc, void *qmp__opaque); > > The handler just needs to squirrel away qmp__cc and qmp__opaque and > call it whenever the command completes. Okay. My preference would be threads, but we can always start with one model and use adapters to switch to another. (and instead of an opaque/func pair, I'd do typedef struct GuestViewFileCompletion { void (*complete)(struct GuestViewFileCompletion *gvfc); } GuestViewFileCompletion; so there's less squirrelling and more type-safetying. ) (and gah, do we really need a vfs/rpc in qemu?) -- error compiling committee.c: too many arguments to function