mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:46:17 +00:00
monitor: eliminate monitor_is_hmp_non_interactive method
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. Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Tested-by: Peter Krempa <pkrempa@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Message-ID: <20260706135824.2623960-23-berrange@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
committed by
Markus Armbruster
parent
eae3e17524
commit
b465a08b0c
@@ -37,7 +37,7 @@ int monitor_new(MonitorOptions *opts, bool allow_hmp, Error **errp);
|
|||||||
int monitor_new_opts(QemuOpts *opts, Error **errp);
|
int monitor_new_opts(QemuOpts *opts, Error **errp);
|
||||||
void monitor_cleanup(void);
|
void monitor_cleanup(void);
|
||||||
|
|
||||||
int monitor_suspend(Monitor *mon);
|
void monitor_suspend(Monitor *mon);
|
||||||
void monitor_resume(Monitor *mon);
|
void monitor_resume(Monitor *mon);
|
||||||
|
|
||||||
int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp);
|
int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include "monitor/hmp.h"
|
#include "monitor/hmp.h"
|
||||||
#include "monitor/hmp-completion.h"
|
#include "monitor/hmp-completion.h"
|
||||||
#include "monitor/monitor.h"
|
#include "monitor/monitor.h"
|
||||||
|
#include "monitor/monitor-internal.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qapi/qapi-commands-migration.h"
|
#include "qapi/qapi-commands-migration.h"
|
||||||
#include "qapi/qapi-visit-migration.h"
|
#include "qapi/qapi-visit-migration.h"
|
||||||
@@ -853,12 +854,14 @@ void hmp_migrate(Monitor *mon, const QDict *qdict)
|
|||||||
|
|
||||||
if (!detach) {
|
if (!detach) {
|
||||||
HMPMigrationStatus *status;
|
HMPMigrationStatus *status;
|
||||||
|
MonitorHMP *hmp = MONITOR_HMP(mon);
|
||||||
|
|
||||||
if (monitor_suspend(mon) < 0) {
|
if (!hmp->use_readline) {
|
||||||
monitor_printf(mon, "terminal does not allow synchronous "
|
monitor_printf(mon, "terminal does not allow synchronous "
|
||||||
"migration, continuing detached\n");
|
"migration, continuing detached\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
monitor_suspend(mon);
|
||||||
|
|
||||||
status = g_malloc0(sizeof(*status));
|
status = g_malloc0(sizeof(*status));
|
||||||
status->mon = mon;
|
status->mon = mon;
|
||||||
|
|||||||
@@ -129,7 +129,10 @@ void hmp_info_version(Monitor *mon, const QDict *qdict)
|
|||||||
|
|
||||||
void hmp_quit(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);
|
qmp_quit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1528,13 +1528,16 @@ static void monitor_read(void *opaque, const uint8_t *buf, int size)
|
|||||||
static void monitor_event(void *opaque, QEMUChrEvent event)
|
static void monitor_event(void *opaque, QEMUChrEvent event)
|
||||||
{
|
{
|
||||||
Monitor *mon = opaque;
|
Monitor *mon = opaque;
|
||||||
|
MonitorHMP *hmp = MONITOR_HMP(mon);
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case CHR_EVENT_MUX_IN:
|
case CHR_EVENT_MUX_IN:
|
||||||
qemu_mutex_lock(&mon->mon_lock);
|
qemu_mutex_lock(&mon->mon_lock);
|
||||||
if (mon->mux_out) {
|
if (mon->mux_out) {
|
||||||
mon->mux_out = 0;
|
mon->mux_out = 0;
|
||||||
monitor_resume(mon);
|
if (hmp->use_readline) {
|
||||||
|
monitor_resume(mon);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
qemu_mutex_unlock(&mon->mon_lock);
|
qemu_mutex_unlock(&mon->mon_lock);
|
||||||
break;
|
break;
|
||||||
@@ -1547,7 +1550,9 @@ static void monitor_event(void *opaque, QEMUChrEvent event)
|
|||||||
} else {
|
} else {
|
||||||
monitor_flush_locked(mon);
|
monitor_flush_locked(mon);
|
||||||
}
|
}
|
||||||
monitor_suspend(mon);
|
if (hmp->use_readline) {
|
||||||
|
monitor_suspend(mon);
|
||||||
|
}
|
||||||
mon->mux_out = 1;
|
mon->mux_out = 1;
|
||||||
}
|
}
|
||||||
qemu_mutex_unlock(&mon->mon_lock);
|
qemu_mutex_unlock(&mon->mon_lock);
|
||||||
@@ -1558,7 +1563,7 @@ static void monitor_event(void *opaque, QEMUChrEvent event)
|
|||||||
"information\n", QEMU_VERSION);
|
"information\n", QEMU_VERSION);
|
||||||
qemu_mutex_lock(&mon->mon_lock);
|
qemu_mutex_lock(&mon->mon_lock);
|
||||||
mon->reset_seen = 1;
|
mon->reset_seen = 1;
|
||||||
if (!mon->mux_out) {
|
if (!mon->mux_out && hmp->use_readline) {
|
||||||
/* Suspend-resume forces the prompt to be printed. */
|
/* Suspend-resume forces the prompt to be printed. */
|
||||||
monitor_suspend(mon);
|
monitor_suspend(mon);
|
||||||
monitor_resume(mon);
|
monitor_resume(mon);
|
||||||
|
|||||||
@@ -157,25 +157,6 @@ bool monitor_requires_iothread(const Monitor *mon)
|
|||||||
return cls->requires_iothread && cls->requires_iothread(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,
|
static gboolean monitor_unblocked(void *do_not_use, GIOCondition cond,
|
||||||
void *opaque)
|
void *opaque)
|
||||||
{
|
{
|
||||||
@@ -550,12 +531,8 @@ static gboolean qapi_event_throttle_equal(const void *a, const void *b)
|
|||||||
return TRUE;
|
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);
|
qatomic_inc(&mon->suspend_cnt);
|
||||||
|
|
||||||
if (monitor_requires_iothread(mon)) {
|
if (monitor_requires_iothread(mon)) {
|
||||||
@@ -567,7 +544,6 @@ int monitor_suspend(Monitor *mon)
|
|||||||
}
|
}
|
||||||
|
|
||||||
trace_monitor_suspend(mon, 1);
|
trace_monitor_suspend(mon, 1);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void monitor_accept_input(void *opaque)
|
static void monitor_accept_input(void *opaque)
|
||||||
@@ -584,10 +560,6 @@ static void monitor_accept_input(void *opaque)
|
|||||||
|
|
||||||
void monitor_resume(Monitor *mon)
|
void monitor_resume(Monitor *mon)
|
||||||
{
|
{
|
||||||
if (monitor_is_hmp_non_interactive(mon)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qatomic_dec_fetch(&mon->suspend_cnt) == 0) {
|
if (qatomic_dec_fetch(&mon->suspend_cnt) == 0) {
|
||||||
AioContext *ctx;
|
AioContext *ctx;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user