[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
- [Qemu-devel] [PATCH v3 06/38] monitor: no need to remove desc before replacing it, (continued)
- [Qemu-devel] [PATCH v3 06/38] monitor: no need to remove desc before replacing it, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 05/38] monitor: further simplify previous patch, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 09/38] json: remove useless return value from lexer/parser, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 08/38] json-lexer: make it safe to call multiple times, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 07/38] json-parser: always set an error if return NULL, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 10/38] tests: add a few qemu-qmp tests, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 13/38] qga: process_event() simplification, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 14/38] monitor: simplify monitor_qmp_respond(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 11/38] tests: change /0.15/* tests to /qmp/*, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 12/38] tests: add a qmp success-response test, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 15/38] qmp: pass and return a QDict to qmp_dispatch(),
Marc-André Lureau <=
- [Qemu-devel] [PATCH v3 17/38] qmp: constify qmp_is_oob(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 16/38] qmp: move 'id' copy to qmp_dispatch(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 18/38] qmp: add QmpSession, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 20/38] QmpSession: add json parser and use it in qga, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 19/38] QmpSession: add a return_cb, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 21/38] QmpSession: add a dispatch callback, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 22/38] monitor: use QmpSession parsing and common dispatch code, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 24/38] qmp: remove qmp_build_error_object(), Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 23/38] QmpSession: introduce QmpReturn, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 26/38] qmp: fold do_qmp_dispatch() in qmp_dispatch(), Marc-André Lureau, 2018/03/26