qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH v3 15/38] qmp: pass and return a QDict to qmp_dispat


From: Marc-André Lureau
Subject: [Qemu-devel] [PATCH v3 15/38] qmp: pass and return a QDict to qmp_dispatch()
Date: Mon, 26 Mar 2018 17:08:53 +0200

qmp_dispatch_check_obj() now must be called before calling
qmp_dispatch() and returns a dict.

Change qmp_dispatch() arguments, clarifying the expected qobject
types, and simplifying a bit the rest of the code.

Signed-off-by: Marc-André Lureau <address@hidden>
---
 include/qapi/qmp/dispatch.h |  2 +-
 monitor.c                   | 24 +++++++++++++-----------
 qapi/qmp-dispatch.c         | 15 +++++----------
 qga/main.c                  | 18 +++++++++---------
 tests/test-qmp-cmds.c       | 36 +++++++++++++++---------------------
 5 files changed, 43 insertions(+), 52 deletions(-)

diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
index ffb4652f71..8e0ac29300 100644
--- a/include/qapi/qmp/dispatch.h
+++ b/include/qapi/qmp/dispatch.h
@@ -40,7 +40,7 @@ void qmp_register_command(QmpCommandList *cmds, const char 
*name,
                           QmpCommandFunc *fn, QmpCommandOptions options);
 void qmp_unregister_command(QmpCommandList *cmds, const char *name);
 QmpCommand *qmp_find_command(QmpCommandList *cmds, const char *name);
-QObject *qmp_dispatch(QmpCommandList *cmds, QObject *request);
+QDict *qmp_dispatch(QmpCommandList *cmds, QDict *request);
 void qmp_disable_command(QmpCommandList *cmds, const char *name);
 void qmp_enable_command(QmpCommandList *cmds, const char *name);
 
diff --git a/monitor.c b/monitor.c
index 0d01e17398..471c57e88c 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3900,17 +3900,17 @@ static int monitor_can_read(void *opaque)
 }
 
 /* take the ownership of rsp & id */
-static void monitor_qmp_respond(Monitor *mon, QObject *rsp, QObject *id)
+static void monitor_qmp_respond(Monitor *mon, QDict *rsp, QObject *id)
 {
     if (!rsp) {
         return;
     }
 
     if (id) {
-        qdict_put_obj(qobject_to(QDict, rsp), "id", id);
+        qdict_put_obj(rsp, "id", id);
     }
     if (mon->qmp.commands == &qmp_cap_negotiation_commands) {
-        QDict *qdict = qdict_get_qdict(qobject_to(QDict, rsp), "error");
+        QDict *qdict = qdict_get_qdict(rsp, "error");
         if (qdict
             && !g_strcmp0(qdict_get_try_str(qdict, "class"),
                           QapiErrorClass_str(ERROR_CLASS_COMMAND_NOT_FOUND))) {
@@ -3919,8 +3919,8 @@ static void monitor_qmp_respond(Monitor *mon, QObject 
*rsp, QObject *id)
                           " negotiation with 'qmp_capabilities'");
         }
     }
-    monitor_json_emitter(mon, rsp);
-    qobject_decref(rsp);
+    monitor_json_emitter(mon, QOBJECT(rsp));
+    QDECREF(rsp);
 }
 
 struct QMPRequest {
@@ -3929,7 +3929,7 @@ struct QMPRequest {
     /* "id" field of the request */
     QObject *id;
     /* Request object to be handled */
-    QObject *req;
+    QDict *req;
 };
 typedef struct QMPRequest QMPRequest;
 
@@ -3940,7 +3940,8 @@ typedef struct QMPRequest QMPRequest;
 static void monitor_qmp_dispatch_one(QMPRequest *req_obj)
 {
     Monitor *mon, *old_mon;
-    QObject *req, *rsp = NULL, *id;
+    QDict *req, *rsp = NULL;
+    QObject *id;
 
     req = req_obj->req;
     mon = req_obj->mon;
@@ -3949,7 +3950,7 @@ static void monitor_qmp_dispatch_one(QMPRequest *req_obj)
     g_free(req_obj);
 
     if (trace_event_get_state_backends(TRACE_HANDLE_QMP_COMMAND)) {
-        QString *req_json = qobject_to_json(req);
+        QString *req_json = qobject_to_json(QOBJECT(req));
         trace_handle_qmp_command(mon, qstring_get_str(req_json));
         QDECREF(req_json);
     }
@@ -3964,7 +3965,8 @@ static void monitor_qmp_dispatch_one(QMPRequest *req_obj)
     /* Respond if necessary */
     monitor_qmp_respond(mon, rsp, id);
 
-    qobject_decref(req);
+
+    QDECREF(req);
 }
 
 /*
@@ -4064,7 +4066,7 @@ static void handle_qmp_command(JSONMessageParser *parser, 
GQueue *tokens)
     req_obj = g_new0(QMPRequest, 1);
     req_obj->mon = mon;
     req_obj->id = id;
-    req_obj->req = req;
+    req_obj->req = qdict;
 
     if (qmp_is_oob(qdict)) {
         /* Out-Of-Band (OOB) requests are executed directly in parser. */
@@ -4115,7 +4117,7 @@ err:
     qdict = qdict_new();
     qdict_put_obj(qdict, "error", qmp_build_error_object(err));
     error_free(err);
-    monitor_qmp_respond(mon, QOBJECT(qdict), id);
+    monitor_qmp_respond(mon, qdict, id);
     qobject_decref(req);
 }
 
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index dd05907265..66596b66a0 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -74,20 +74,15 @@ QDict *qmp_dispatch_check_obj(const QObject *request, Error 
**errp)
     return dict;
 }
 
-static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
+static QObject *do_qmp_dispatch(QmpCommandList *cmds, QDict *dict,
                                 Error **errp)
 {
     Error *local_err = NULL;
     const char *command;
-    QDict *args, *dict;
+    QDict *args;
     QmpCommand *cmd;
     QObject *ret = NULL;
 
-    dict = qmp_dispatch_check_obj(request, errp);
-    if (!dict) {
-        return NULL;
-    }
-
     command = qdict_get_str(dict, "execute");
     cmd = qmp_find_command(cmds, command);
     if (cmd == NULL) {
@@ -151,13 +146,13 @@ bool qmp_is_oob(QDict *dict)
     return qbool_get_bool(bool_obj);
 }
 
-QObject *qmp_dispatch(QmpCommandList *cmds, QObject *request)
+QDict *qmp_dispatch(QmpCommandList *cmds, QDict *req)
 {
     Error *err = NULL;
     QObject *ret;
     QDict *rsp;
 
-    ret = do_qmp_dispatch(cmds, request, &err);
+    ret = do_qmp_dispatch(cmds, req, &err);
 
     rsp = qdict_new();
     if (err) {
@@ -170,5 +165,5 @@ QObject *qmp_dispatch(QmpCommandList *cmds, QObject 
*request)
         return NULL;
     }
 
-    return QOBJECT(rsp);
+    return rsp;
 }
diff --git a/qga/main.c b/qga/main.c
index 71468e68c2..04f7dad0b3 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -583,7 +583,8 @@ static int send_response(GAState *s, QObject *payload)
 static void process_event(JSONMessageParser *parser, GQueue *tokens)
 {
     GAState *s = container_of(parser, GAState, parser);
-    QObject *req, *rsp = NULL;
+    QObject *obj;
+    QDict *req, *rsp = NULL;
     Error *err = NULL;
     int ret;
 
@@ -591,12 +592,12 @@ static void process_event(JSONMessageParser *parser, 
GQueue *tokens)
 
     g_debug("process_event: called");
 
-    req = json_parser_parse_err(tokens, NULL, &err);
+    obj = json_parser_parse_err(tokens, NULL, &err);
     if (err) {
         goto end;
     }
 
-    qmp_dispatch_check_obj(req, &err);
+    req = qmp_dispatch_check_obj(obj, &err);
     if (err) {
         goto end;
     }
@@ -606,19 +607,18 @@ static void process_event(JSONMessageParser *parser, 
GQueue *tokens)
 
 end:
     if (err) {
-        QDict *qdict = qdict_new();
-        qdict_put_obj(qdict, "error", qmp_build_error_object(err));
+        rsp = qdict_new();
+        qdict_put_obj(rsp, "error", qmp_build_error_object(err));
         error_free(err);
-        rsp = QOBJECT(qdict);
     }
     if (rsp) {
-        ret = send_response(s, rsp);
+        ret = send_response(s, QOBJECT(rsp));
         if (ret < 0) {
             g_warning("error sending error response: %s", strerror(-ret));
         }
-        qobject_decref(rsp);
+        QDECREF(rsp);
     }
-    qobject_decref(req);
+    qobject_decref(obj);
 }
 
 /* false return signals GAChannel to close the current client connection */
diff --git a/tests/test-qmp-cmds.c b/tests/test-qmp-cmds.c
index 02cbaf41a2..52e2738a93 100644
--- a/tests/test-qmp-cmds.c
+++ b/tests/test-qmp-cmds.c
@@ -97,16 +97,15 @@ __org_qemu_x_Union1 
*qmp___org_qemu_x_command(__org_qemu_x_EnumList *a,
 /* test commands with no input and no return value */
 static void test_dispatch_cmd(void)
 {
-    QDict *req = qdict_new();
-    QObject *resp;
+    QDict *resp, *req = qdict_new();
 
     qdict_put_str(req, "execute", "user_def_cmd");
 
-    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+    resp = qmp_dispatch(&qmp_commands, req);
     assert(resp != NULL);
-    assert(!qdict_haskey(qobject_to(QDict, resp), "error"));
+    assert(!qdict_haskey(resp, "error"));
 
-    qobject_decref(resp);
+    QDECREF(resp);
     QDECREF(req);
 }
 
@@ -114,16 +113,15 @@ static void test_dispatch_cmd(void)
 static void test_dispatch_cmd_failure(void)
 {
     QDict *req = qdict_new();
-    QDict *args = qdict_new();
-    QObject *resp;
+    QDict *resp, *args = qdict_new();
 
     qdict_put_str(req, "execute", "user_def_cmd2");
 
-    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+    resp = qmp_dispatch(&qmp_commands, req);
     assert(resp != NULL);
-    assert(qdict_haskey(qobject_to(QDict, resp), "error"));
+    assert(qdict_haskey(resp, "error"));
 
-    qobject_decref(resp);
+    QDECREF(resp);
     QDECREF(req);
 
     /* check that with extra arguments it throws an error */
@@ -133,39 +131,35 @@ static void test_dispatch_cmd_failure(void)
 
     qdict_put_str(req, "execute", "user_def_cmd");
 
-    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+    resp = qmp_dispatch(&qmp_commands, req);
     assert(resp != NULL);
-    assert(qdict_haskey(qobject_to(QDict, resp), "error"));
+    assert(qdict_haskey(resp, "error"));
 
-    qobject_decref(resp);
+    QDECREF(resp);
     QDECREF(req);
 }
 
 static void test_dispatch_cmd_success_response(void)
 {
-    QDict *req = qdict_new();
-    QObject *resp;
+    QDict *resp, *req = qdict_new();
 
     qdict_put_str(req, "execute", "cmd-success-response");
-    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+    resp = qmp_dispatch(&qmp_commands, req);
     assert(resp == NULL);
     QDECREF(req);
 }
 
 static QObject *test_qmp_dispatch(QDict *req)
 {
-    QObject *resp_obj;
     QDict *resp;
     QObject *ret;
 
-    resp_obj = qmp_dispatch(&qmp_commands, QOBJECT(req));
-    assert(resp_obj);
-    resp = qobject_to(QDict, resp_obj);
+    resp = qmp_dispatch(&qmp_commands, req);
     assert(resp && !qdict_haskey(resp, "error"));
     ret = qdict_get(resp, "return");
     assert(ret);
     qobject_incref(ret);
-    qobject_decref(resp_obj);
+    QDECREF(resp);
     return ret;
 }
 
-- 
2.17.0.rc1.1.g4c4f2b46a3




reply via email to

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