From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:47854) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SWTto-0000C8-Ln for qemu-devel@nongnu.org; Mon, 21 May 2012 10:47:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SWTtj-000104-Rk for qemu-devel@nongnu.org; Mon, 21 May 2012 10:47:52 -0400 Received: from mx1.redhat.com ([209.132.183.28]:12752) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SWTtj-0000zN-Js for qemu-devel@nongnu.org; Mon, 21 May 2012 10:47:47 -0400 Message-ID: <4FBA5569.2030405@redhat.com> Date: Mon, 21 May 2012 16:47:05 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <4FB6821A.1080902@redhat.com> <20120521105901.4fbe7363@doriath.home> <4FBA4CE0.2090702@codemonkey.ws> <20120521111637.308bdaa6@doriath.home> <4FBA4ED9.6010906@codemonkey.ws> <4FBA5078.2050702@redhat.com> <4FBA53E9.2030800@codemonkey.ws> In-Reply-To: <4FBA53E9.2030800@codemonkey.ws> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] Proposal for extensions of block job commands in QEMU 1.2 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Kevin Wolf , Stefan Hajnoczi , qemu-devel , Luiz Capitulino , Federico Simoncelli , Eric Blake Il 21/05/2012 16:40, Anthony Liguori ha scritto: > On 05/21/2012 09:26 AM, Paolo Bonzini wrote: >> Il 21/05/2012 16:19, Anthony Liguori ha scritto: >>>> >>> >>> I'm not against it in principle, just in practice. Today, checking >>> whether a command exists is: >>> >>> commands = qmp.query_commands() >>> >>> if 'block-stream' in commands: >>> # has block-stream >>> >>> I have a hard time envisioning how schema introspection can be >>> reasonably implemented in a client. >> >> schema = qmp.query_command_schema('block-stream') > > What would schema return? > > Did you mean: > > if schema['arguments'].has_key('on_error'): Yes, something like that. > What about adding a parameter to a structure? schema = qmp.query_type('foo') if schema['data'].has_key('xyz') > BTW, the other problem with adding arguments like this is that it makes > a stable C API impossible. Adding fields to structs is not a problem as long as "libqmp" takes care of all allocations on part of its client. Adding parameters to commands requires some smartness, but there are ways to do it: 1) add the first version number to the schema, generate versioned entry points qmp_block_stream_v1_1 qmp_block_stream_v1_2 etc. Provide multiple headers libqmp-1.1.h, libqmp-1.2.h etc. that take care of #define'ing qmp_block_stream to one of them 2) Same as (1) but use qmp_block_stream for the oldest version having the command. 3) have fun with the preprocessor (macro with variable arguments, sizeof, designated initializers, whatever) and emulate keyword arguments for the C API. Paolo