Skip to content

Commit

Permalink
qmp: Call monitor_set_cur() only in qmp_dispatch()
Browse files Browse the repository at this point in the history
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 <[email protected]>
Message-Id: <[email protected]>
Reviewed-by: Markus Armbruster <[email protected]>
Reviewed-by: Stefan Hajnoczi <[email protected]>
Signed-off-by: Markus Armbruster <[email protected]>
  • Loading branch information
kevmw authored and Markus Armbruster committed Oct 9, 2020
1 parent 57d3635 commit 41725fa
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 13 deletions.
3 changes: 2 additions & 1 deletion include/qapi/qmp/dispatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 **);
Expand Down Expand Up @@ -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);
Expand Down
9 changes: 2 additions & 7 deletions monitor/qmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
8 changes: 7 additions & 1 deletion qapi/qmp-dispatch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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: */
Expand Down
2 changes: 1 addition & 1 deletion qga/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 5 additions & 0 deletions stubs/monitor-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}
Expand Down
6 changes: 3 additions & 3 deletions tests/test-qmp-cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 41725fa

Please sign in to comment.