qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: aliguori@us.ibm.com
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 03/26] qapi: add code generation support for middle mode
Date: Wed,  5 Oct 2011 10:21:48 -0300	[thread overview]
Message-ID: <1317820931-25872-4-git-send-email-lcapitulino@redhat.com> (raw)
In-Reply-To: <1317820931-25872-1-git-send-email-lcapitulino@redhat.com>

From: Anthony Liguori <aliguori@us.ibm.com>

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 <aliguori@us.ibm.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 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'
-- 
1.7.7.rc0.72.g4b5ea

  parent reply	other threads:[~2011-10-05 13:22 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-05 13:21 [Qemu-devel] [PULL 00/26]: QMP queue Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 01/26] error: let error_is_type take a NULL error Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 02/26] qerror: add qerror_report_err() Luiz Capitulino
2011-10-05 13:21 ` Luiz Capitulino [this message]
2011-10-05 13:21 ` [Qemu-devel] [PATCH 04/26] qapi: use middle mode in QMP server Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 05/26] qapi: fixup command generation for functions that return list types Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 06/26] qapi: dealloc visitor, fix premature free and iteration logic Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 07/26] qapi: generate qapi_free_* functions for *List types Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 08/26] qapi: add test cases for generated free functions Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 09/26] qapi: dealloc visitor, support freeing of nested lists Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 10/26] qapi: modify visitor code generation for list iteration Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 11/26] qapi: Don't use c_var() on enum strings Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 12/26] qapi: Automatically generate a _MAX value for enums Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 13/26] qapi: convert query-name Luiz Capitulino
2011-10-05 13:21 ` [Qemu-devel] [PATCH 14/26] qapi: Convert query-version Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 15/26] qapi: Convert query-kvm Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 16/26] vl: Change qemu_vmstop_requested() to return a bool Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 17/26] RunState: Drop the RSTATE_NO_STATE value Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 18/26] RunState: Rename enum values as generated by the QAPI Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 19/26] qapi: Convert query-status Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 20/26] qapi: Convert query-uuid Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 21/26] qapi: Convert query-chardev Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 22/26] qapi: Convert query-commands Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 23/26] qapi: Convert quit Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 24/26] qapi: Convert stop Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 25/26] qapi: Convert system_reset Luiz Capitulino
2011-10-05 13:22 ` [Qemu-devel] [PATCH 26/26] qapi: Convert system_powerdown Luiz Capitulino
2011-10-10 14:45 ` [Qemu-devel] [PULL 00/26]: QMP queue Anthony Liguori
  -- strict thread matches above, loose matches on Subject: below --
2011-09-30 20:34 [Qemu-devel] [PATCH v2 00/26]: First round of QAPI conversions Luiz Capitulino
2011-09-30 20:34 ` [Qemu-devel] [PATCH 03/26] qapi: add code generation support for middle mode Luiz Capitulino

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1317820931-25872-4-git-send-email-lcapitulino@redhat.com \
    --to=lcapitulino@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).