This prepares the work for HMP commands to be asynchronous. Start making QMP human-monitor-command asynchronous, although QmpReturn is used synchronously on error or after handle_hmp_command().
Signed-off-by: Marc-André Lureau <[email protected]> --- qapi/misc.json | 3 ++- monitor.c | 14 ++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/qapi/misc.json b/qapi/misc.json index 8b3ca4fdd3..f8fd4824fb 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -1344,7 +1344,8 @@ ## { 'command': 'human-monitor-command', 'data': {'command-line': 'str', '*cpu-index': 'int'}, - 'returns': 'str' } + 'returns': 'str', + 'async': true } ## # @ObjectPropertyInfo: diff --git a/monitor.c b/monitor.c index 76bc2f8c7c..477ccd852d 100644 --- a/monitor.c +++ b/monitor.c @@ -743,8 +743,8 @@ static void monitor_data_destroy(Monitor *mon) g_queue_free(mon->qmp.qmp_requests); } -char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index, - int64_t cpu_index, Error **errp) +void qmp_human_monitor_command(const char *command_line, bool has_cpu_index, + int64_t cpu_index, QmpReturn *qret) { char *output = NULL; Monitor *old_mon, hmp; @@ -757,15 +757,15 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index, if (has_cpu_index) { int ret = monitor_set_cpu(cpu_index); if (ret < 0) { - cur_mon = old_mon; - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "cpu-index", + Error *err = NULL; + error_setg(&err, QERR_INVALID_PARAMETER_VALUE, "cpu-index", "a CPU number"); + qmp_return_error(qret, err); goto out; } } handle_hmp_command(&hmp, command_line); - cur_mon = old_mon; qemu_mutex_lock(&hmp.mon_lock); if (qstring_get_length(hmp.outbuf) > 0) { @@ -775,9 +775,11 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index, } qemu_mutex_unlock(&hmp.mon_lock); + qmp_human_monitor_command_return(qret, output); + out: + cur_mon = old_mon; monitor_data_destroy(&hmp); - return output; } static int compare_cmd(const char *name, const char *list) -- 2.21.0.196.g041f5ea1cf
