qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 25/36] qmp: introduce async command type


From: marcandre . lureau
Subject: [Qemu-devel] [PATCH 25/36] qmp: introduce async command type
Date: Fri, 25 Sep 2015 16:03:53 +0200

From: Marc-André Lureau <address@hidden>

Learn a new type of command, QmpCommandFuncAsync. They can return later
thanks to QmpReturn. This commit introduces the new types and register
functions.

Signed-off-by: Marc-André Lureau <address@hidden>
---
 include/qapi/qmp/dispatch.h |  5 +++++
 qapi/qmp-dispatch.c         |  3 +++
 qapi/qmp-registry.c         | 26 ++++++++++++++++++++++----
 3 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
index 747fff9..e45ab9f 100644
--- a/include/qapi/qmp/dispatch.h
+++ b/include/qapi/qmp/dispatch.h
@@ -36,10 +36,12 @@ struct QmpClient {
 };
 
 typedef void (QmpCommandFunc)(QDict *, QObject **, Error **);
+typedef void (QmpCommandFuncAsync)(QDict *, QmpReturn *);
 
 typedef enum QmpCommandType
 {
     QCT_NORMAL,
+    QCT_ASYNC,
 } QmpCommandType;
 
 typedef enum QmpCommandOptions
@@ -53,6 +55,7 @@ typedef struct QmpCommand
     const char *name;
     QmpCommandType type;
     QmpCommandFunc *fn;
+    QmpCommandFuncAsync *fn_async;
     QmpCommandOptions options;
     QTAILQ_ENTRY(QmpCommand) node;
     bool enabled;
@@ -60,6 +63,8 @@ typedef struct QmpCommand
 
 void qmp_register_command(const char *name, QmpCommandFunc *fn,
                           QmpCommandOptions options);
+void qmp_register_async_command(const char *name, QmpCommandFuncAsync *fn,
+                                QmpCommandOptions options);
 QmpCommand *qmp_find_command(const char *name);
 void qmp_client_init(QmpClient *client, QmpDispatchReturn *return_cb);
 void qmp_client_destroy(QmpClient *client);
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index d2cc300..83ecab5 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -104,6 +104,9 @@ static QObject *do_qmp_dispatch(QObject *request, QmpReturn 
*qret, Error **errp)
             ret = QOBJECT(qdict_new());
         }
         break;
+    case QCT_ASYNC:
+        cmd->fn_async(args, qret);
+        break;
     }
 
     QDECREF(args);
diff --git a/qapi/qmp-registry.c b/qapi/qmp-registry.c
index 3e4498a..90f6a8c 100644
--- a/qapi/qmp-registry.c
+++ b/qapi/qmp-registry.c
@@ -19,17 +19,35 @@
 static QTAILQ_HEAD(QmpCommandList, QmpCommand) qmp_commands =
     QTAILQ_HEAD_INITIALIZER(qmp_commands);
 
-void qmp_register_command(const char *name, QmpCommandFunc *fn,
-                          QmpCommandOptions options)
+static QmpCommand *qmp_command_new(const char *name,
+                                   QmpCommandOptions options)
 {
     QmpCommand *cmd = g_malloc0(sizeof(*cmd));
 
     cmd->name = name;
-    cmd->type = QCT_NORMAL;
-    cmd->fn = fn;
     cmd->enabled = true;
     cmd->options = options;
     QTAILQ_INSERT_TAIL(&qmp_commands, cmd, node);
+
+    return cmd;
+}
+
+void qmp_register_command(const char *name, QmpCommandFunc *fn,
+                          QmpCommandOptions options)
+{
+    QmpCommand *cmd = qmp_command_new(name, options);
+
+    cmd->type = QCT_NORMAL;
+    cmd->fn = fn;
+}
+
+void qmp_register_async_command(const char *name, QmpCommandFuncAsync *fn,
+                                QmpCommandOptions options)
+{
+    QmpCommand *cmd = qmp_command_new(name, options);
+
+    cmd->type = QCT_ASYNC;
+    cmd->fn_async = fn;
 }
 
 QmpCommand *qmp_find_command(const char *name)
-- 
2.4.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]