monitor: introduce monitor_qmp_respond()
A tiny refactoring, preparing to split the QMP dispatcher away. Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> Message-Id: <20180309090006.10018-12-peterx@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> [eblake: rebase to qobject_to() usage] Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
02130314d8
commit
546aa56674
50
monitor.c
50
monitor.c
@ -3822,6 +3822,38 @@ static int monitor_can_read(void *opaque)
|
|||||||
return (mon->suspend_cnt == 0) ? 1 : 0;
|
return (mon->suspend_cnt == 0) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor_json_emitter(mon, rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
qobject_decref(id);
|
||||||
|
qobject_decref(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
|
static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
|
||||||
{
|
{
|
||||||
QObject *req, *rsp = NULL, *id = NULL;
|
QObject *req, *rsp = NULL, *id = NULL;
|
||||||
@ -3873,24 +3905,8 @@ static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
|
|||||||
}
|
}
|
||||||
|
|
||||||
err_out:
|
err_out:
|
||||||
if (err) {
|
monitor_qmp_respond(mon, rsp, err, id);
|
||||||
qdict = qdict_new();
|
|
||||||
qdict_put_obj(qdict, "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);
|
|
||||||
qobject_decref(req);
|
qobject_decref(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user