From patchwork Wed Oct 5 13:21:48 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Capitulino X-Patchwork-Id: 117837 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id C1101B6F9B for ; Thu, 6 Oct 2011 00:22:54 +1100 (EST) Received: from localhost ([::1]:56166 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RBRQt-0003i4-S2 for incoming@patchwork.ozlabs.org; Wed, 05 Oct 2011 09:22:47 -0400 Received: from eggs.gnu.org ([140.186.70.92]:51762) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RBRQa-0003C4-V9 for qemu-devel@nongnu.org; Wed, 05 Oct 2011 09:22:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RBRQV-0001il-Ni for qemu-devel@nongnu.org; Wed, 05 Oct 2011 09:22:28 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52591) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RBRQV-0001if-FK for qemu-devel@nongnu.org; Wed, 05 Oct 2011 09:22:23 -0400 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p95DMM2N011739 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Oct 2011 09:22:22 -0400 Received: from localhost (ovpn-113-108.phx2.redhat.com [10.3.113.108]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p95DMLQB000593; Wed, 5 Oct 2011 09:22:22 -0400 From: Luiz Capitulino To: aliguori@us.ibm.com Date: Wed, 5 Oct 2011 10:21:48 -0300 Message-Id: <1317820931-25872-4-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1317820931-25872-1-git-send-email-lcapitulino@redhat.com> References: <1317820931-25872-1-git-send-email-lcapitulino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 209.132.183.28 Cc: qemu-devel@nongnu.org Subject: [Qemu-devel] [PATCH 03/26] qapi: add code generation support for middle mode X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Anthony Liguori To get the ball rolling merging QAPI, this patch introduces a "middle mode" to the code generator. In middle mode, the code generator generates marshalling functions that are compatible with the current QMP server. We absolutely need to replace the current QMP server in order to support proper asynchronous commands but using a middle mode provides a middle-ground that lets us start converting commands in tree. Note that all of the commands have been converted already in my glib branch. Middle mode only exists until we finish merging them from my branch into the main tree. Signed-off-by: Anthony Liguori Signed-off-by: Luiz Capitulino --- qapi/qapi-types-core.h | 3 ++ scripts/qapi-commands.py | 79 +++++++++++++++++++++++++++++++++++++-------- scripts/qapi-types.py | 3 ++ scripts/qapi.py | 4 ++- 4 files changed, 74 insertions(+), 15 deletions(-) diff --git a/qapi/qapi-types-core.h b/qapi/qapi-types-core.h index a79bc2b..27e6be0 100644 --- a/qapi/qapi-types-core.h +++ b/qapi/qapi-types-core.h @@ -17,4 +17,7 @@ #include "qemu-common.h" #include "error.h" +/* FIXME this is temporary until we remove middle mode */ +#include "monitor.h" + #endif diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index bf61740..2776804 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -167,9 +167,10 @@ qmp_input_visitor_cleanup(mi); pop_indent() return ret.rstrip() -def gen_marshal_output(name, args, ret_type): +def gen_marshal_output(name, args, ret_type, middle_mode): if not ret_type: return "" + ret = mcgen(''' static void qmp_marshal_output_%(c_name)s(%(c_ret_type)s ret_in, QObject **ret_out, Error **errp) { @@ -188,16 +189,34 @@ static void qmp_marshal_output_%(c_name)s(%(c_ret_type)s ret_in, QObject **ret_o qapi_dealloc_visitor_cleanup(md); } ''', - c_ret_type=c_type(ret_type), c_name=c_var(name), ret_type=ret_type) + c_ret_type=c_type(ret_type), c_name=c_var(name), + ret_type=ret_type) return ret -def gen_marshal_input(name, args, ret_type): +def gen_marshal_input_decl(name, args, ret_type, middle_mode): + if middle_mode: + return 'int qmp_marshal_input_%s(Monitor *mon, const QDict *qdict, QObject **ret)' % c_var(name) + else: + return 'static void qmp_marshal_input_%s(QDict *args, QObject **ret, Error **errp)' % c_var(name) + + + +def gen_marshal_input(name, args, ret_type, middle_mode): + hdr = gen_marshal_input_decl(name, args, ret_type, middle_mode) + ret = mcgen(''' -static void qmp_marshal_input_%(c_name)s(QDict *args, QObject **ret, Error **errp) +%(header)s { ''', - c_name=c_var(name)) + header=hdr) + + if middle_mode: + ret += mcgen(''' + Error *local_err = NULL; + Error **errp = &local_err; + QDict *args = (QDict *)qdict; +''') if ret_type: if c_type(ret_type).endswith("*"): @@ -220,6 +239,10 @@ static void qmp_marshal_input_%(c_name)s(QDict *args, QObject **ret, Error **err visitor_input_containers_decl=gen_visitor_input_containers_decl(args), visitor_input_vars_decl=gen_visitor_input_vars_decl(args), visitor_input_block=gen_visitor_input_block(args, "QOBJECT(args)")) + else: + ret += mcgen(''' + (void)args; +''') ret += mcgen(''' if (error_is_set(errp)) { @@ -234,10 +257,29 @@ out: ''') ret += mcgen(''' %(visitor_input_block_cleanup)s +''', + visitor_input_block_cleanup=gen_visitor_input_block(args, None, + dealloc=True)) + + if middle_mode: + ret += mcgen(''' + + if (local_err) { + qerror_report_err(local_err); + error_free(local_err); + return -1; + } + return 0; +''') + else: + ret += mcgen(''' return; +''') + + ret += mcgen(''' } -''', - visitor_input_block_cleanup=gen_visitor_input_block(args, None, dealloc=True)) +''') + return ret def gen_registry(commands): @@ -284,7 +326,7 @@ def gen_command_decl_prologue(header, guard, prefix=""): #include "error.h" ''', - header=basename(h_file), guard=guardname(h_file), prefix=prefix) + header=basename(header), guard=guardname(header), prefix=prefix) return ret def gen_command_def_prologue(prefix="", proxy=False): @@ -317,11 +359,11 @@ def gen_command_def_prologue(prefix="", proxy=False): prefix=prefix) if not proxy: ret += '#include "%sqmp-commands.h"' % prefix - return ret + "\n" + return ret + "\n\n" try: - opts, args = getopt.gnu_getopt(sys.argv[1:], "p:o:", ["prefix=", "output-dir=", "type="]) + opts, args = getopt.gnu_getopt(sys.argv[1:], "p:o:m", ["prefix=", "output-dir=", "type=", "middle"]) except getopt.GetoptError, err: print str(err) sys.exit(1) @@ -331,6 +373,7 @@ prefix = "" dispatch_type = "sync" c_file = 'qmp-marshal.c' h_file = 'qmp-commands.h' +middle_mode = False for o, a in opts: if o in ("-p", "--prefix"): @@ -339,6 +382,8 @@ for o, a in opts: output_dir = a + "/" elif o in ("-t", "--type"): dispatch_type = a + elif o in ("-m", "--middle"): + middle_mode = True c_file = output_dir + prefix + c_file h_file = output_dir + prefix + h_file @@ -370,14 +415,20 @@ if dispatch_type == "sync": ret = generate_command_decl(cmd['command'], arglist, ret_type) + "\n" fdecl.write(ret) if ret_type: - ret = gen_marshal_output(cmd['command'], arglist, ret_type) + "\n" + ret = gen_marshal_output(cmd['command'], arglist, ret_type, middle_mode) + "\n" fdef.write(ret) - ret = gen_marshal_input(cmd['command'], arglist, ret_type) + "\n" + + if middle_mode: + fdecl.write('%s;\n' % gen_marshal_input_decl(cmd['command'], arglist, ret_type, middle_mode)) + + ret = gen_marshal_input(cmd['command'], arglist, ret_type, middle_mode) + "\n" fdef.write(ret) fdecl.write("\n#endif\n"); - ret = gen_registry(commands) - fdef.write(ret) + + if not middle_mode: + ret = gen_registry(commands) + fdef.write(ret) fdef.flush() fdef.close() diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index cece325..fc0f7af 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -268,3 +268,6 @@ fdecl.write(''' fdecl.flush() fdecl.close() + +fdef.flush() +fdef.close() diff --git a/scripts/qapi.py b/scripts/qapi.py index 56af232..5299976 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -200,4 +200,6 @@ def basename(filename): return filename.split("/")[-1] def guardname(filename): - return filename.replace("/", "_").replace("-", "_").split(".")[0].upper() + if filename.startswith('./'): + filename = filename[2:] + return filename.replace("/", "_").replace("-", "_").split(".")[0].upper() + '_H'