[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 03/25] qmp: teach qmp_dispatch() to take a pre-fi
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH v2 03/25] qmp: teach qmp_dispatch() to take a pre-filled QDict |
Date: |
Wed, 18 Jan 2017 20:03:10 +0400 |
Give an optional qdict for the dispatch call to be used for the
reply. The qemu monitor has the request "id" pre-filled, simplifying the
code a bit.
Signed-off-by: Marc-André Lureau <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
include/qapi/qmp/dispatch.h | 2 +-
monitor.c | 26 +++++++++++---------------
qapi/qmp-dispatch.c | 5 ++---
qga/main.c | 2 +-
tests/test-qmp-commands.c | 8 ++++----
5 files changed, 19 insertions(+), 24 deletions(-)
diff --git a/include/qapi/qmp/dispatch.h b/include/qapi/qmp/dispatch.h
index 57651ea955..db483481b0 100644
--- a/include/qapi/qmp/dispatch.h
+++ b/include/qapi/qmp/dispatch.h
@@ -38,7 +38,7 @@ void qmp_register_command(const char *name, QmpCommandFunc
*fn,
QmpCommandOptions options);
void qmp_unregister_command(const char *name);
QmpCommand *qmp_find_command(const char *name);
-QObject *qmp_dispatch(QObject *request);
+QObject *qmp_dispatch(QObject *request, QDict *rsp);
void qmp_disable_command(const char *name);
void qmp_enable_command(const char *name);
bool qmp_command_is_enabled(const QmpCommand *cmd);
diff --git a/monitor.c b/monitor.c
index 0841d436b0..edd30e4d8f 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3725,12 +3725,13 @@ static QDict *qmp_check_input_obj(QObject *input_obj,
Error **errp)
static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
{
- QObject *req, *rsp = NULL, *id = NULL;
- QDict *qdict = NULL;
+ QObject *req, *rsp, *id = NULL;
+ QDict *qdict, *rqdict = qdict_new();
const char *cmd_name;
Monitor *mon = cur_mon;
Error *err = NULL;
+ rsp = QOBJECT(rqdict);
req = json_parser_parse_err(tokens, NULL, &err);
if (err || !req || qobject_type(req) != QTYPE_QDICT) {
if (!err) {
@@ -3745,8 +3746,11 @@ static void handle_qmp_command(JSONMessageParser
*parser, GQueue *tokens)
}
id = qdict_get(qdict, "id");
- qobject_incref(id);
- qdict_del(qdict, "id");
+ if (id) {
+ qobject_incref(id);
+ qdict_del(qdict, "id");
+ qdict_put_obj(rqdict, "id", id);
+ }
cmd_name = qdict_get_str(qdict, "execute");
trace_handle_qmp_command(mon, cmd_name);
@@ -3755,27 +3759,19 @@ static void handle_qmp_command(JSONMessageParser
*parser, GQueue *tokens)
goto err_out;
}
- rsp = qmp_dispatch(req);
+ rsp = qmp_dispatch(req, rqdict);
err_out:
if (err) {
- qdict = qdict_new();
- qdict_put_obj(qdict, "error", qmp_build_error_object(err));
+ qdict_put_obj(rqdict, "error", qmp_build_error_object(err));
error_free(err);
- rsp = QOBJECT(qdict);
}
if (rsp) {
- if (id) {
- qdict_put_obj(qobject_to_qdict(rsp), "id", id);
- id = NULL;
- }
-
monitor_json_emitter(mon, rsp);
}
- qobject_decref(id);
- qobject_decref(rsp);
+ QDECREF(rqdict);
qobject_decref(req);
}
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index 505eb418ac..dbf2e5b655 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -116,15 +116,14 @@ QObject *qmp_build_error_object(Error *err)
error_get_pretty(err));
}
-QObject *qmp_dispatch(QObject *request)
+QObject *qmp_dispatch(QObject *request, QDict *rsp)
{
Error *err = NULL;
QObject *ret;
- QDict *rsp;
ret = do_qmp_dispatch(request, &err);
- rsp = qdict_new();
+ rsp = rsp ?: qdict_new();
if (err) {
qdict_put_obj(rsp, "error", qmp_build_error_object(err));
error_free(err);
diff --git a/qga/main.c b/qga/main.c
index 6caf215575..442990c869 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -555,7 +555,7 @@ static void process_command(GAState *s, QDict *req)
g_assert(req);
g_debug("processing command");
- rsp = qmp_dispatch(QOBJECT(req));
+ rsp = qmp_dispatch(QOBJECT(req), NULL);
if (rsp) {
ret = send_response(s, rsp);
if (ret) {
diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
index e46981eb1e..a6d8e4b141 100644
--- a/tests/test-qmp-commands.c
+++ b/tests/test-qmp-commands.c
@@ -94,7 +94,7 @@ static void test_dispatch_cmd(void)
qdict_put_obj(req, "execute", QOBJECT(qstring_from_str("user_def_cmd")));
- resp = qmp_dispatch(QOBJECT(req));
+ resp = qmp_dispatch(QOBJECT(req), NULL);
assert(resp != NULL);
assert(!qdict_haskey(qobject_to_qdict(resp), "error"));
@@ -111,7 +111,7 @@ static void test_dispatch_cmd_failure(void)
qdict_put_obj(req, "execute", QOBJECT(qstring_from_str("user_def_cmd2")));
- resp = qmp_dispatch(QOBJECT(req));
+ resp = qmp_dispatch(QOBJECT(req), NULL);
assert(resp != NULL);
assert(qdict_haskey(qobject_to_qdict(resp), "error"));
@@ -125,7 +125,7 @@ static void test_dispatch_cmd_failure(void)
qdict_put_obj(req, "execute", QOBJECT(qstring_from_str("user_def_cmd")));
- resp = qmp_dispatch(QOBJECT(req));
+ resp = qmp_dispatch(QOBJECT(req), NULL);
assert(resp != NULL);
assert(qdict_haskey(qobject_to_qdict(resp), "error"));
@@ -139,7 +139,7 @@ static QObject *test_qmp_dispatch(QDict *req)
QDict *resp;
QObject *ret;
- resp_obj = qmp_dispatch(QOBJECT(req));
+ resp_obj = qmp_dispatch(QOBJECT(req), NULL);
assert(resp_obj);
resp = qobject_to_qdict(resp_obj);
assert(resp && !qdict_haskey(resp, "error"));
--
2.11.0.295.gd7dffce1c
- [Qemu-devel] [PATCH v2 00/25] qmp: add async command type, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 01/25] tests: start generic qemu-qmp tests, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 02/25] tests: change /0.15/* tests to /qmp/*, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 03/25] qmp: teach qmp_dispatch() to take a pre-filled QDict,
Marc-André Lureau <=
- [Qemu-devel] [PATCH v2 04/25] qmp: use a return callback for the command reply, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 05/25] qmp: add QmpClient, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 06/25] qmp: add qmp_return_is_cancelled(), Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 08/25] qapi: ignore top-level 'id' field, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 07/25] qmp: introduce async command type, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 09/25] qmp: take 'id' from request, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 10/25] qmp: check that async command have an 'id', Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 11/25] scripts: learn 'async' qapi commands, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 12/25] tests: add dispatch async tests, Marc-André Lureau, 2017/01/18
- [Qemu-devel] [PATCH v2 13/25] monitor: add 'async' capability, Marc-André Lureau, 2017/01/18