In order to fix the bad screendumps (same as rhbz#1230527), call into the asynchonous version of the QMP command.
Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- hmp-commands.hx | 3 ++- include/ui/console.h | 5 ++--- monitor/hmp-cmds.c | 6 ++---- ui/console.c | 24 +----------------------- 4 files changed, 7 insertions(+), 31 deletions(-) diff --git a/hmp-commands.hx b/hmp-commands.hx index bfa5681dd2..fa559d6a4e 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -278,7 +278,8 @@ ETEXI .params = "filename [device [head]]", .help = "save screen from head 'head' of display device 'device' " "into PPM image 'filename'", - .cmd = hmp_screendump, + .async_cmd = hmp_screendump_async, + .async = true, }, STEXI diff --git a/include/ui/console.h b/include/ui/console.h index a1935557cc..d0a2a2066f 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -6,6 +6,7 @@ #include "qemu/notify.h" #include "qemu/error-report.h" #include "qapi/qapi-types-ui.h" +#include "qapi/qmp/dispatch.h" #ifdef CONFIG_OPENGL # include <epoxy/gl.h> @@ -74,9 +75,7 @@ typedef struct MouseTransformInfo { } MouseTransformInfo; void hmp_mouse_set(Monitor *mon, const QDict *qdict); -void hmp_screendump_sync(const char *filename, - bool has_device, const char *device, - bool has_head, int64_t head, Error **errp); +void hmp_screendump_async(Monitor *mon, const QDict *qdict, QmpReturn *qret); /* keysym is a unicode code except for special keys (see QEMU_KEY_xxx constants) */ diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 50a25a1ddc..e2af0e6307 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -2334,15 +2334,13 @@ err_out: goto out; } -void hmp_screendump(Monitor *mon, const QDict *qdict) +void hmp_screendump_async(Monitor *mon, const QDict *qdict, QmpReturn *qret) { const char *filename = qdict_get_str(qdict, "filename"); const char *id = qdict_get_try_str(qdict, "device"); int64_t head = qdict_get_try_int(qdict, "head", 0); - Error *err = NULL; - hmp_screendump_sync(filename, id != NULL, id, id != NULL, head, &err); - hmp_handle_error(mon, &err); + qmp_screendump(filename, id != NULL, id, id != NULL, head, qret); } void hmp_nbd_server_start(Monitor *mon, const QDict *qdict) diff --git a/ui/console.c b/ui/console.c index 29c850c31c..7436b153b9 100644 --- a/ui/console.c +++ b/ui/console.c @@ -280,7 +280,7 @@ static void qmp_screendump_finish(QemuConsole *con, struct qmp_screendump *dump) goto cleanup; } - cur_mon = qmp_return_get_monitor(dump->ret); + cur_mon = qmp_return_get_monitor(dump->ret, true); surface = qemu_console_surface(con); if (!surface) { error_setg(&err, "no surface"); @@ -430,28 +430,6 @@ static QemuConsole *get_console(bool has_device, const char *device, return con; } -void hmp_screendump_sync(const char *filename, - bool has_device, const char *device, - bool has_head, int64_t head, Error **errp) -{ - DisplaySurface *surface; - QemuConsole *con = get_console(has_device, device, has_head, head, errp); - - if (!con) { - return; - } - /* This may not complete the drawing with Spice, you may have - * glitches or outdated dumps, use qmp instead! */ - graphic_hw_update(con); - surface = qemu_console_surface(con); - if (!surface) { - error_setg(errp, "no surface"); - return; - } - - ppm_save(filename, surface, errp); -} - void qmp_screendump(const char *filename, bool has_device, const char *device, bool has_head, int64_t head, -- 2.22.0.428.g6d5b264208