qmp: Call monitor_set_cur() only in qmp_dispatch()
The correct way to set the current monitor for a coroutine handler will be different than for a blocking handler, so monitor_set_cur() needs to be called in qmp_dispatch(). Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20201005155855.256490-7-kwolf@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
57d3635e42
commit
41725fa7ed
@ -14,6 +14,7 @@
|
||||
#ifndef QAPI_QMP_DISPATCH_H
|
||||
#define QAPI_QMP_DISPATCH_H
|
||||
|
||||
#include "monitor/monitor.h"
|
||||
#include "qemu/queue.h"
|
||||
|
||||
typedef void (QmpCommandFunc)(QDict *, QObject **, Error **);
|
||||
@ -49,7 +50,7 @@ const char *qmp_command_name(const QmpCommand *cmd);
|
||||
bool qmp_has_success_response(const QmpCommand *cmd);
|
||||
QDict *qmp_error_response(Error *err);
|
||||
QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
|
||||
bool allow_oob);
|
||||
bool allow_oob, Monitor *cur_mon);
|
||||
bool qmp_is_oob(const QDict *dict);
|
||||
|
||||
typedef void (*qmp_cmd_callback_fn)(const QmpCommand *cmd, void *opaque);
|
||||
|
@ -135,16 +135,11 @@ static void monitor_qmp_respond(MonitorQMP *mon, QDict *rsp)
|
||||
|
||||
static void monitor_qmp_dispatch(MonitorQMP *mon, QObject *req)
|
||||
{
|
||||
Monitor *old_mon;
|
||||
QDict *rsp;
|
||||
QDict *error;
|
||||
|
||||
old_mon = monitor_set_cur(&mon->common);
|
||||
assert(old_mon == NULL);
|
||||
|
||||
rsp = qmp_dispatch(mon->commands, req, qmp_oob_enabled(mon));
|
||||
|
||||
monitor_set_cur(NULL);
|
||||
rsp = qmp_dispatch(mon->commands, req, qmp_oob_enabled(mon),
|
||||
&mon->common);
|
||||
|
||||
if (mon->commands == &qmp_cap_negotiation_commands) {
|
||||
error = qdict_get_qdict(rsp, "error");
|
||||
|
@ -89,7 +89,7 @@ bool qmp_is_oob(const QDict *dict)
|
||||
}
|
||||
|
||||
QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
|
||||
bool allow_oob)
|
||||
bool allow_oob, Monitor *cur_mon)
|
||||
{
|
||||
Error *err = NULL;
|
||||
bool oob;
|
||||
@ -152,7 +152,13 @@ QDict *qmp_dispatch(const QmpCommandList *cmds, QObject *request,
|
||||
args = qdict_get_qdict(dict, "arguments");
|
||||
qobject_ref(args);
|
||||
}
|
||||
|
||||
assert(monitor_cur() == NULL);
|
||||
monitor_set_cur(cur_mon);
|
||||
|
||||
cmd->fn(args, &ret, &err);
|
||||
|
||||
monitor_set_cur(NULL);
|
||||
qobject_unref(args);
|
||||
if (err) {
|
||||
/* or assert(!ret) after reviewing all handlers: */
|
||||
|
@ -579,7 +579,7 @@ static void process_event(void *opaque, QObject *obj, Error *err)
|
||||
}
|
||||
|
||||
g_debug("processing command");
|
||||
rsp = qmp_dispatch(&ga_commands, obj, false);
|
||||
rsp = qmp_dispatch(&ga_commands, obj, false, NULL);
|
||||
|
||||
end:
|
||||
ret = send_response(s, rsp);
|
||||
|
@ -8,6 +8,11 @@ Monitor *monitor_cur(void)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Monitor *monitor_set_cur(Monitor *mon)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void monitor_init_qmp(Chardev *chr, bool pretty, Error **errp)
|
||||
{
|
||||
}
|
||||
|
@ -152,7 +152,7 @@ static QObject *do_qmp_dispatch(bool allow_oob, const char *template, ...)
|
||||
req = qdict_from_vjsonf_nofail(template, ap);
|
||||
va_end(ap);
|
||||
|
||||
resp = qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob);
|
||||
resp = qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob, NULL);
|
||||
g_assert(resp);
|
||||
ret = qdict_get(resp, "return");
|
||||
g_assert(ret);
|
||||
@ -175,7 +175,7 @@ static void do_qmp_dispatch_error(bool allow_oob, ErrorClass cls,
|
||||
req = qdict_from_vjsonf_nofail(template, ap);
|
||||
va_end(ap);
|
||||
|
||||
resp = qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob);
|
||||
resp = qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob, NULL);
|
||||
g_assert(resp);
|
||||
error = qdict_get_qdict(resp, "error");
|
||||
g_assert(error);
|
||||
@ -231,7 +231,7 @@ static void test_dispatch_cmd_success_response(void)
|
||||
QDict *resp;
|
||||
|
||||
qdict_put_str(req, "execute", "cmd-success-response");
|
||||
resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false);
|
||||
resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false, NULL);
|
||||
g_assert_null(resp);
|
||||
qobject_unref(req);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user