The monitor_is_hmp_non_interactive method is used by monitor_suspend and monitor_resume, to make them a no-op if the HMP does not use readline. There are only a handful of callers of suspend/resume and they can be made to skip the call when readline is not present. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- include/monitor/monitor.h | 2 +- migration/migration-hmp-cmds.c | 5 ++++- monitor/hmp-cmds.c | 5 ++++- monitor/hmp.c | 11 ++++++++--- monitor/monitor.c | 30 +----------------------------- 5 files changed, 18 insertions(+), 35 deletions(-) diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h index 3f730cffee..ffda343585 100644 --- a/include/monitor/monitor.h +++ b/include/monitor/monitor.h @@ -34,7 +34,7 @@ int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp); int monitor_new_opts(QemuOpts *opts, Error **errp); void monitor_cleanup(void); -int monitor_suspend(Monitor *mon); +void monitor_suspend(Monitor *mon); void monitor_resume(Monitor *mon); int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp); diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c index 8b385f560e..502ca704da 100644 --- a/migration/migration-hmp-cmds.c +++ b/migration/migration-hmp-cmds.c @@ -19,6 +19,7 @@ #include "monitor/hmp.h" #include "monitor/hmp-completion.h" #include "monitor/monitor.h" +#include "monitor/monitor-internal.h" #include "qapi/error.h" #include "qapi/qapi-commands-migration.h" #include "qapi/qapi-visit-migration.h" @@ -853,12 +854,14 @@ void hmp_migrate(Monitor *mon, const QDict *qdict) if (!detach) { HMPMigrationStatus *status; + MonitorHMP *hmp = MONITOR_HMP(mon); - if (monitor_suspend(mon) < 0) { + if (!hmp->use_readline) { monitor_printf(mon, "terminal does not allow synchronous " "migration, continuing detached\n"); return; } + monitor_suspend(mon); status = g_malloc0(sizeof(*status)); status->mon = mon; diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index e139caeba9..e9fb8d827a 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -129,7 +129,10 @@ void hmp_info_version(Monitor *mon, const QDict *qdict) void hmp_quit(Monitor *mon, const QDict *qdict) { - monitor_suspend(mon); + MonitorHMP *hmp = MONITOR_HMP(mon); + if (hmp->use_readline) { + monitor_suspend(mon); + } qmp_quit(NULL); } diff --git a/monitor/hmp.c b/monitor/hmp.c index 1da9370ead..b8cccdcde3 100644 --- a/monitor/hmp.c +++ b/monitor/hmp.c @@ -1528,13 +1528,16 @@ static void monitor_read(void *opaque, const uint8_t *buf, int size) static void monitor_event(void *opaque, QEMUChrEvent event) { Monitor *mon = opaque; + MonitorHMP *hmp = MONITOR_HMP(mon); switch (event) { case CHR_EVENT_MUX_IN: qemu_mutex_lock(&mon->mon_lock); if (mon->mux_out) { mon->mux_out = 0; - monitor_resume(mon); + if (hmp->use_readline) { + monitor_resume(mon); + } } qemu_mutex_unlock(&mon->mon_lock); break; @@ -1547,7 +1550,9 @@ static void monitor_event(void *opaque, QEMUChrEvent event) } else { monitor_flush_locked(mon); } - monitor_suspend(mon); + if (hmp->use_readline) { + monitor_suspend(mon); + } mon->mux_out = 1; } qemu_mutex_unlock(&mon->mon_lock); @@ -1558,7 +1563,7 @@ static void monitor_event(void *opaque, QEMUChrEvent event) "information\n", QEMU_VERSION); qemu_mutex_lock(&mon->mon_lock); mon->reset_seen = 1; - if (!mon->mux_out) { + if (!mon->mux_out && hmp->use_readline) { /* Suspend-resume forces the prompt to be printed. */ monitor_suspend(mon); monitor_resume(mon); diff --git a/monitor/monitor.c b/monitor/monitor.c index 0cace985f0..c401e23b7b 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -154,25 +154,6 @@ bool monitor_requires_iothread(const Monitor *mon) return cls->requires_iothread && cls->requires_iothread(mon); } -/** - * Is @mon is using readline? - * Note: not all HMP monitors use readline, e.g., gdbserver has a - * non-interactive HMP monitor, so readline is not used there. - */ -static inline bool monitor_uses_readline(const MonitorHMP *mon) -{ - return mon->use_readline; -} - -static inline bool monitor_is_hmp_non_interactive(const Monitor *mon) -{ - if (!object_dynamic_cast(OBJECT(mon), TYPE_MONITOR_HMP)) { - return false; - } - - return !monitor_uses_readline(container_of(mon, MonitorHMP, parent_obj)); -} - static gboolean monitor_unblocked(void *do_not_use, GIOCondition cond, void *opaque) { @@ -547,12 +528,8 @@ static gboolean qapi_event_throttle_equal(const void *a, const void *b) return TRUE; } -int monitor_suspend(Monitor *mon) +void monitor_suspend(Monitor *mon) { - if (monitor_is_hmp_non_interactive(mon)) { - return -ENOTTY; - } - qatomic_inc(&mon->suspend_cnt); if (monitor_requires_iothread(mon)) { @@ -564,7 +541,6 @@ int monitor_suspend(Monitor *mon) } trace_monitor_suspend(mon, 1); - return 0; } static void monitor_accept_input(void *opaque) @@ -581,10 +557,6 @@ static void monitor_accept_input(void *opaque) void monitor_resume(Monitor *mon) { - if (monitor_is_hmp_non_interactive(mon)) { - return; - } - if (qatomic_dec_fetch(&mon->suspend_cnt) == 0) { AioContext *ctx; -- 2.54.0