diff mbox

[25/36] qmp: introduce async command type

Message ID 1443189844-20341-26-git-send-email-marcandre.lureau@redhat.com
State New
Headers show

Commit Message

Marc-André Lureau Sept. 25, 2015, 2:03 p.m. UTC
From: Marc-André Lureau <marcandre.lureau@redhat.com>

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 <marcandre.lureau@redhat.com>
---
 include/qapi/qmp/dispatch.h |  5 +++++
 qapi/qmp-dispatch.c         |  3 +++
 qapi/qmp-registry.c         | 26 ++++++++++++++++++++++----
 3 files changed, 30 insertions(+), 4 deletions(-)
diff mbox

Patch

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)