[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 03/15] qapi: add code generation support for middle
From: |
Anthony Liguori |
Subject: |
[Qemu-devel] [PATCH 03/15] qapi: add code generation support for middle mode |
Date: |
Fri, 2 Sep 2011 12:34:46 -0500 |
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 <address@hidden>
---
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..f5d402c 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'
--
1.7.4.1
- [Qemu-devel] [PATCH 00/15] Convert commands to QAPI (batch 1) (v2), Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 01/15] error: let error_is_type take a NULL error, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 02/15] qerror: add qerror_report_err() (v2), Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 03/15] qapi: add code generation support for middle mode,
Anthony Liguori <=
- [Qemu-devel] [PATCH 04/15] qapi: use middle mode in QMP server (v2), Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 05/15] qapi: convert query-name, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 07/15] monitor: expose readline state, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 08/15] qerror: add additional parameter to QERR_DEVICE_ENCRYPTED, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 06/15] block: add unsafe_probe, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 09/15] qapi: convert eject (qmp and hmp) to QAPI, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 10/15] qapi: convert block_passwd and add set-blockdev-password, Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 11/15] qapi: add change-vnc-password (v2), Anthony Liguori, 2011/09/02
- [Qemu-devel] [PATCH 12/15] qapi: add change-vnc-listen (v2), Anthony Liguori, 2011/09/02