[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 14/38] monitor: simplify monitor_qmp_respond()
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH v3 14/38] monitor: simplify monitor_qmp_respond() |
Date: |
Mon, 26 Mar 2018 17:08:52 +0200 |
Since the error path is at a single location, we can create the
response object there, simplifying argument handling. While at it,
also simplify id ownership: no need for the extra reference count.
Signed-off-by: Marc-André Lureau <address@hidden>
---
monitor.c | 58 ++++++++++++++++++++-----------------------------------
1 file changed, 21 insertions(+), 37 deletions(-)
diff --git a/monitor.c b/monitor.c
index e9d0c4d172..0d01e17398 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3899,46 +3899,27 @@ static int monitor_can_read(void *opaque)
return !atomic_mb_read(&mon->suspend_cnt);
}
-/*
- * 1. This function takes ownership of rsp, err, and id.
- * 2. rsp, err, and id may be NULL.
- * 3. If err != NULL then rsp must be NULL.
- */
-static void monitor_qmp_respond(Monitor *mon, QObject *rsp,
- Error *err, QObject *id)
+/* take the ownership of rsp & id */
+static void monitor_qmp_respond(Monitor *mon, QObject *rsp, QObject *id)
{
- QDict *qdict = NULL;
-
- if (err) {
- assert(!rsp);
- qdict = qdict_new();
- qdict_put_obj(qdict, "error", qmp_build_error_object(err));
- error_free(err);
- rsp = QOBJECT(qdict);
- }
-
- if (rsp) {
- if (id) {
- /* This is for the qdict below. */
- qobject_incref(id);
- qdict_put_obj(qobject_to(QDict, rsp), "id", id);
- }
+ if (!rsp) {
+ return;
+ }
- if (mon->qmp.commands == &qmp_cap_negotiation_commands) {
- qdict = qdict_get_qdict(qobject_to(QDict, rsp), "error");
- if (qdict
- && !g_strcmp0(qdict_get_try_str(qdict, "class"),
+ if (id) {
+ qdict_put_obj(qobject_to(QDict, rsp), "id", id);
+ }
+ if (mon->qmp.commands == &qmp_cap_negotiation_commands) {
+ QDict *qdict = qdict_get_qdict(qobject_to(QDict, rsp), "error");
+ if (qdict
+ && !g_strcmp0(qdict_get_try_str(qdict, "class"),
QapiErrorClass_str(ERROR_CLASS_COMMAND_NOT_FOUND))) {
- /* Provide a more useful error message */
- qdict_put_str(qdict, "desc", "Expecting capabilities"
- " negotiation with 'qmp_capabilities'");
- }
+ /* Provide a more useful error message */
+ qdict_put_str(qdict, "desc", "Expecting capabilities"
+ " negotiation with 'qmp_capabilities'");
}
-
- monitor_json_emitter(mon, rsp);
}
-
- qobject_decref(id);
+ monitor_json_emitter(mon, rsp);
qobject_decref(rsp);
}
@@ -3981,7 +3962,7 @@ static void monitor_qmp_dispatch_one(QMPRequest *req_obj)
cur_mon = old_mon;
/* Respond if necessary */
- monitor_qmp_respond(mon, rsp, NULL, id);
+ monitor_qmp_respond(mon, rsp, id);
qobject_decref(req);
}
@@ -4131,7 +4112,10 @@ static void handle_qmp_command(JSONMessageParser
*parser, GQueue *tokens)
return;
err:
- monitor_qmp_respond(mon, NULL, err, NULL);
+ qdict = qdict_new();
+ qdict_put_obj(qdict, "error", qmp_build_error_object(err));
+ error_free(err);
+ monitor_qmp_respond(mon, QOBJECT(qdict), id);
qobject_decref(req);
}
--
2.17.0.rc1.1.g4c4f2b46a3
- [Qemu-devel] [PATCH v3 04/38] monitor: no need to save need_resume, (continued)
- [Qemu-devel] [PATCH v3 04/38] monitor: no need to save need_resume, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 02/38] qmp-shell: learn to send commands with quoted arguments, Marc-André Lureau, 2018/03/26
- [Qemu-devel] [PATCH v3 01/38] HACK: add back OOB, Marc-André Lureau, 2018/03/26
- [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 <=
- [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, 2018/03/26
- [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