From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org, armbru@redhat.com
Subject: Re: [Qemu-devel] [RFC PATCH 04/10] monitor: Create MonitorHMP with readline state
Date: Fri, 7 Jun 2019 17:32:20 +0100 [thread overview]
Message-ID: <20190607163219.GO2631@work-vm> (raw)
In-Reply-To: <20190607135430.22149-5-kwolf@redhat.com>
* Kevin Wolf (kwolf@redhat.com) wrote:
> The ReadLineState in Monitor is only used for HMP monitors. Create
> MonitorHMP and move it there.
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> ---
> include/monitor/monitor.h | 5 +-
> hmp.c | 4 +-
> monitor.c | 123 +++++++++++++++++++++-----------------
> 3 files changed, 75 insertions(+), 57 deletions(-)
>
> diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
> index 86656297f1..1ba354f811 100644
> --- a/include/monitor/monitor.h
> +++ b/include/monitor/monitor.h
> @@ -7,6 +7,7 @@
> #include "qemu/readline.h"
>
> extern __thread Monitor *cur_mon;
> +typedef struct MonitorHMP MonitorHMP;
>
> /* flags for monitor_init */
> /* 0x01 unused */
> @@ -35,8 +36,8 @@ void monitor_flush(Monitor *mon);
> int monitor_set_cpu(int cpu_index);
> int monitor_get_cpu_index(void);
>
> -void monitor_read_command(Monitor *mon, int show_prompt);
> -int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
> +void monitor_read_command(MonitorHMP *mon, int show_prompt);
> +int monitor_read_password(MonitorHMP *mon, ReadLineFunc *readline_func,
> void *opaque);
>
> AddfdInfo *monitor_fdset_add_fd(int fd, bool has_fdset_id, int64_t fdset_id,
> diff --git a/hmp.c b/hmp.c
> index be5e345c6f..99414cd39c 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -1943,6 +1943,8 @@ static void hmp_change_read_arg(void *opaque, const char *password,
>
> void hmp_change(Monitor *mon, const QDict *qdict)
> {
> + /* FIXME Make MonitorHMP public and use container_of */
> + MonitorHMP *hmp_mon = (MonitorHMP *) mon;
> const char *device = qdict_get_str(qdict, "device");
> const char *target = qdict_get_str(qdict, "target");
> const char *arg = qdict_get_try_str(qdict, "arg");
> @@ -1960,7 +1962,7 @@ void hmp_change(Monitor *mon, const QDict *qdict)
> if (strcmp(target, "passwd") == 0 ||
> strcmp(target, "password") == 0) {
> if (!arg) {
> - monitor_read_password(mon, hmp_change_read_arg, NULL);
> + monitor_read_password(hmp_mon, hmp_change_read_arg, NULL);
> return;
> }
> }
> diff --git a/monitor.c b/monitor.c
> index d18cf18393..810f3dcf9c 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -190,14 +190,6 @@ struct Monitor {
> bool skip_flush;
> bool use_io_thread;
>
> - /*
> - * State used only in the thread "owning" the monitor.
> - * If @use_io_thread, this is @mon_iothread.
> - * Else, it's the main thread.
> - * These members can be safely accessed without locks.
> - */
> - ReadLineState *rs;
> -
> gchar *mon_cpu_path;
> mon_cmd_t *cmd_table;
> QTAILQ_ENTRY(Monitor) entry;
> @@ -218,6 +210,17 @@ struct Monitor {
> int mux_out;
> };
>
> +struct MonitorHMP {
> + Monitor common;
> + /*
> + * State used only in the thread "owning" the monitor.
> + * If @use_io_thread, this is @mon_iothread.
> + * Else, it's the main thread.
> + * These members can be safely accessed without locks.
> + */
> + ReadLineState *rs;
> +};
> +
> typedef struct {
> Monitor common;
> JSONMessageParser parser;
> @@ -324,7 +327,7 @@ bool monitor_cur_is_qmp(void)
> return cur_mon && monitor_is_qmp(cur_mon);
> }
>
> -void monitor_read_command(Monitor *mon, int show_prompt)
> +void monitor_read_command(MonitorHMP *mon, int show_prompt)
> {
> if (!mon->rs)
> return;
> @@ -334,7 +337,7 @@ void monitor_read_command(Monitor *mon, int show_prompt)
> readline_show_prompt(mon->rs);
> }
>
> -int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
> +int monitor_read_password(MonitorHMP *mon, ReadLineFunc *readline_func,
> void *opaque)
> {
> if (mon->rs) {
> @@ -342,7 +345,8 @@ int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
> /* prompt is printed on return from the command handler */
> return 0;
> } else {
> - monitor_printf(mon, "terminal does not support password prompting\n");
> + monitor_printf(&mon->common,
> + "terminal does not support password prompting\n");
> return -ENOTTY;
> }
> }
> @@ -703,7 +707,7 @@ static void monitor_qapi_event_init(void)
> qapi_event_throttle_equal);
> }
>
> -static void handle_hmp_command(Monitor *mon, const char *cmdline);
> +static void handle_hmp_command(MonitorHMP *mon, const char *cmdline);
>
> static void monitor_iothread_init(void);
>
> @@ -738,8 +742,10 @@ static void monitor_data_destroy(Monitor *mon)
> if (monitor_is_qmp(mon)) {
> MonitorQMP *qmp_mon = container_of(mon, MonitorQMP, common);
> monitor_data_destroy_qmp(qmp_mon);
> + } else {
> + MonitorHMP *hmp_mon = container_of(mon, MonitorHMP, common);
> + readline_free(hmp_mon->rs);
> }
> - readline_free(mon->rs);
> qobject_unref(mon->outbuf);
> qemu_mutex_destroy(&mon->mon_lock);
> }
> @@ -748,12 +754,13 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
> int64_t cpu_index, Error **errp)
> {
> char *output = NULL;
> - Monitor *old_mon, hmp;
> + Monitor *old_mon;
> + MonitorHMP hmp = {};
>
> - monitor_data_init(&hmp, 0, true, false);
> + monitor_data_init(&hmp.common, 0, true, false);
>
> old_mon = cur_mon;
> - cur_mon = &hmp;
> + cur_mon = &hmp.common;
>
> if (has_cpu_index) {
> int ret = monitor_set_cpu(cpu_index);
> @@ -768,16 +775,16 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
> handle_hmp_command(&hmp, command_line);
> cur_mon = old_mon;
>
> - qemu_mutex_lock(&hmp.mon_lock);
> - if (qstring_get_length(hmp.outbuf) > 0) {
> - output = g_strdup(qstring_get_str(hmp.outbuf));
> + qemu_mutex_lock(&hmp.common.mon_lock);
> + if (qstring_get_length(hmp.common.outbuf) > 0) {
> + output = g_strdup(qstring_get_str(hmp.common.outbuf));
> } else {
> output = g_strdup("");
> }
> - qemu_mutex_unlock(&hmp.mon_lock);
> + qemu_mutex_unlock(&hmp.common.mon_lock);
>
> out:
> - monitor_data_destroy(&hmp);
> + monitor_data_destroy(&hmp.common);
> return output;
> }
>
> @@ -1341,14 +1348,15 @@ static void hmp_info_sync_profile(Monitor *mon, const QDict *qdict)
>
> static void hmp_info_history(Monitor *mon, const QDict *qdict)
> {
> + MonitorHMP *hmp_mon = container_of(mon, MonitorHMP, common);
> int i;
> const char *str;
>
> - if (!mon->rs)
> + if (!hmp_mon->rs)
> return;
> i = 0;
> for(;;) {
> - str = readline_get_history(mon->rs, i);
> + str = readline_get_history(hmp_mon->rs, i);
> if (!str)
> break;
> monitor_printf(mon, "%d: '%s'\n", i, str);
> @@ -3048,11 +3056,12 @@ static const mon_cmd_t *search_dispatch_table(const mon_cmd_t *disp_table,
> * Do not assume the return value points into @table! It doesn't when
> * the command is found in a sub-command table.
> */
> -static const mon_cmd_t *monitor_parse_command(Monitor *mon,
> +static const mon_cmd_t *monitor_parse_command(MonitorHMP *hmp_mon,
> const char *cmdp_start,
> const char **cmdp,
> mon_cmd_t *table)
> {
> + Monitor *mon = &hmp_mon->common;
> const char *p;
> const mon_cmd_t *cmd;
> char cmdname[256];
> @@ -3083,7 +3092,7 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
> *cmdp = p;
> /* search sub command */
> if (cmd->sub_table != NULL && *p != '\0') {
> - return monitor_parse_command(mon, cmdp_start, cmdp, cmd->sub_table);
> + return monitor_parse_command(hmp_mon, cmdp_start, cmdp, cmd->sub_table);
> }
>
> return cmd;
> @@ -3460,7 +3469,7 @@ fail:
> return NULL;
> }
>
> -static void handle_hmp_command(Monitor *mon, const char *cmdline)
> +static void handle_hmp_command(MonitorHMP *mon, const char *cmdline)
> {
> QDict *qdict;
> const mon_cmd_t *cmd;
> @@ -3468,26 +3477,26 @@ static void handle_hmp_command(Monitor *mon, const char *cmdline)
>
> trace_handle_hmp_command(mon, cmdline);
>
> - cmd = monitor_parse_command(mon, cmdline, &cmdline, mon->cmd_table);
> + cmd = monitor_parse_command(mon, cmdline, &cmdline, mon->common.cmd_table);
> if (!cmd) {
> return;
> }
>
> - qdict = monitor_parse_arguments(mon, &cmdline, cmd);
> + qdict = monitor_parse_arguments(&mon->common, &cmdline, cmd);
> if (!qdict) {
> while (cmdline > cmd_start && qemu_isspace(cmdline[-1])) {
> cmdline--;
> }
> - monitor_printf(mon, "Try \"help %.*s\" for more information\n",
> + monitor_printf(&mon->common, "Try \"help %.*s\" for more information\n",
> (int)(cmdline - cmd_start), cmd_start);
> return;
> }
>
> - cmd->cmd(mon, qdict);
> + cmd->cmd(&mon->common, qdict);
> qobject_unref(qdict);
> }
>
> -static void cmd_completion(Monitor *mon, const char *name, const char *list)
> +static void cmd_completion(MonitorHMP *mon, const char *name, const char *list)
> {
> const char *p, *pstart;
> char cmd[128];
> @@ -3511,7 +3520,7 @@ static void cmd_completion(Monitor *mon, const char *name, const char *list)
> }
> }
>
> -static void file_completion(Monitor *mon, const char *input)
> +static void file_completion(MonitorHMP *mon, const char *input)
> {
> DIR *ffs;
> struct dirent *d;
> @@ -4000,7 +4009,7 @@ void loadvm_completion(ReadLineState *rs, int nb_args, const char *str)
> }
> }
>
> -static void monitor_find_completion_by_table(Monitor *mon,
> +static void monitor_find_completion_by_table(MonitorHMP *mon,
> const mon_cmd_t *cmd_table,
> char **args,
> int nb_args)
> @@ -4095,7 +4104,7 @@ static void monitor_find_completion_by_table(Monitor *mon,
> static void monitor_find_completion(void *opaque,
> const char *cmdline)
> {
> - Monitor *mon = opaque;
> + MonitorHMP *mon = opaque;
> char *args[MAX_ARGS];
> int nb_args, len;
>
> @@ -4115,7 +4124,7 @@ static void monitor_find_completion(void *opaque,
> }
>
> /* 2. auto complete according to args */
> - monitor_find_completion_by_table(mon, mon->cmd_table, args, nb_args);
> + monitor_find_completion_by_table(mon, mon->common.cmd_table, args, nb_args);
>
> cleanup:
> free_cmdline_args(args, nb_args);
> @@ -4326,19 +4335,21 @@ static void monitor_qmp_read(void *opaque, const uint8_t *buf, int size)
>
> static void monitor_read(void *opaque, const uint8_t *buf, int size)
> {
> + MonitorHMP *mon;
> Monitor *old_mon = cur_mon;
> int i;
>
> cur_mon = opaque;
> + mon = container_of(cur_mon, MonitorHMP, common);
>
> - if (cur_mon->rs) {
> + if (mon->rs) {
> for (i = 0; i < size; i++)
> - readline_handle_byte(cur_mon->rs, buf[i]);
> + readline_handle_byte(mon->rs, buf[i]);
> } else {
> if (size == 0 || buf[size - 1] != 0)
> monitor_printf(cur_mon, "corrupted command\n");
> else
> - handle_hmp_command(cur_mon, (char *)buf);
> + handle_hmp_command(mon, (char *)buf);
> }
>
> cur_mon = old_mon;
> @@ -4347,11 +4358,11 @@ static void monitor_read(void *opaque, const uint8_t *buf, int size)
> static void monitor_command_cb(void *opaque, const char *cmdline,
> void *readline_opaque)
> {
> - Monitor *mon = opaque;
> + MonitorHMP *mon = opaque;
>
> - monitor_suspend(mon);
> + monitor_suspend(&mon->common);
> handle_hmp_command(mon, cmdline);
> - monitor_resume(mon);
> + monitor_resume(&mon->common);
> }
>
> int monitor_suspend(Monitor *mon)
> @@ -4397,8 +4408,9 @@ void monitor_resume(Monitor *mon)
> }
>
> if (!monitor_is_qmp(mon)) {
> - assert(mon->rs);
> - readline_show_prompt(mon->rs);
> + MonitorHMP *hmp_mon = container_of(mon, MonitorHMP, common);
> + assert(hmp_mon->rs);
> + readline_show_prompt(hmp_mon->rs);
> }
>
> aio_bh_schedule_oneshot(ctx, monitor_accept_input, mon);
> @@ -4460,6 +4472,7 @@ static void monitor_qmp_event(void *opaque, int event)
> static void monitor_event(void *opaque, int event)
> {
> Monitor *mon = opaque;
> + MonitorHMP *hmp_mon = container_of(cur_mon, MonitorHMP, common);
>
> switch (event) {
> case CHR_EVENT_MUX_IN:
> @@ -4467,7 +4480,7 @@ static void monitor_event(void *opaque, int event)
> mon->mux_out = 0;
> qemu_mutex_unlock(&mon->mon_lock);
> if (mon->reset_seen) {
> - readline_restart(mon->rs);
> + readline_restart(hmp_mon->rs);
> monitor_resume(mon);
> monitor_flush(mon);
> } else {
> @@ -4494,8 +4507,8 @@ static void monitor_event(void *opaque, int event)
> monitor_printf(mon, "QEMU %s monitor - type 'help' for more "
> "information\n", QEMU_VERSION);
> if (!mon->mux_out) {
> - readline_restart(mon->rs);
> - readline_show_prompt(mon->rs);
> + readline_restart(hmp_mon->rs);
> + readline_show_prompt(hmp_mon->rs);
> }
> mon->reset_seen = 1;
> mon_refcount++;
> @@ -4556,15 +4569,17 @@ void monitor_init_globals(void)
> static void GCC_FMT_ATTR(2, 3) monitor_readline_printf(void *opaque,
> const char *fmt, ...)
> {
> + MonitorHMP *mon = opaque;
> va_list ap;
> va_start(ap, fmt);
> - monitor_vprintf(opaque, fmt, ap);
> + monitor_vprintf(&mon->common, fmt, ap);
> va_end(ap);
> }
>
> static void monitor_readline_flush(void *opaque)
> {
> - monitor_flush(opaque);
> + MonitorHMP *mon = opaque;
> + monitor_flush(&mon->common);
> }
>
> /*
> @@ -4662,11 +4677,11 @@ static void monitor_init_qmp(Chardev *chr, int flags)
>
> static void monitor_init_hmp(Chardev *chr, int flags)
> {
> - Monitor *mon = g_malloc(sizeof(*mon));
> + MonitorHMP *mon = g_malloc0(sizeof(*mon));
> bool use_readline = flags & MONITOR_USE_READLINE;
>
> - monitor_data_init(mon, flags, false, false);
> - qemu_chr_fe_init(&mon->chr, chr, &error_abort);
> + monitor_data_init(&mon->common, flags, false, false);
> + qemu_chr_fe_init(&mon->common.chr, chr, &error_abort);
>
> if (use_readline) {
> mon->rs = readline_init(monitor_readline_printf,
> @@ -4676,9 +4691,9 @@ static void monitor_init_hmp(Chardev *chr, int flags)
> monitor_read_command(mon, 0);
> }
>
> - qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_read,
> - monitor_event, NULL, mon, NULL, true);
> - monitor_list_append(mon);
> + qemu_chr_fe_set_handlers(&mon->common.chr, monitor_can_read, monitor_read,
> + monitor_event, NULL, &mon->common, NULL, true);
> + monitor_list_append(&mon->common);
> }
>
> void monitor_init(Chardev *chr, int flags)
> --
> 2.20.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2019-06-07 18:24 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-07 13:54 [Qemu-devel] [RFC PATCH 00/10] monitor: Split monitor.c in core/HMP/QMP/misc Kevin Wolf
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 01/10] monitor: Remove unused password prompting fields Kevin Wolf
2019-06-07 15:39 ` Dr. David Alan Gilbert
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 02/10] monitor: Split monitor_init in HMP and QMP function Kevin Wolf
2019-06-07 15:46 ` Dr. David Alan Gilbert
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 03/10] monitor: Make MonitorQMP a child class of Monitor Kevin Wolf
2019-06-07 16:17 ` Dr. David Alan Gilbert
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 04/10] monitor: Create MonitorHMP with readline state Kevin Wolf
2019-06-07 16:32 ` Dr. David Alan Gilbert [this message]
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 05/10] monitor: Move cmd_table to MonitorHMP Kevin Wolf
2019-06-07 16:35 ` Dr. David Alan Gilbert
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 06/10] Move monitor.c to monitor/misc.c Kevin Wolf
2019-06-07 16:39 ` Dr. David Alan Gilbert
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 07/10] monitor: Create monitor_int.h with common definitions Kevin Wolf
2019-06-07 16:52 ` Dr. David Alan Gilbert
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 08/10] monitor: Split out monitor/qmp.c Kevin Wolf
2019-06-07 16:59 ` Dr. David Alan Gilbert
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 09/10] monitor: Split out monitor/hmp.c Kevin Wolf
2019-06-07 17:21 ` Dr. David Alan Gilbert
2019-06-07 13:54 ` [Qemu-devel] [RFC PATCH 10/10] monitor: Split out monitor/core.c Kevin Wolf
2019-06-07 17:29 ` Dr. David Alan Gilbert
2019-06-11 9:22 ` Kevin Wolf
2019-06-11 9:25 ` Dr. David Alan Gilbert
2019-06-07 17:30 ` Dr. David Alan Gilbert
2019-06-07 14:03 ` [Qemu-devel] [RFC PATCH 00/10] monitor: Split monitor.c in core/HMP/QMP/misc Daniel P. Berrangé
2019-06-07 14:25 ` Kevin Wolf
2019-06-07 14:31 ` Daniel P. Berrangé
2019-06-07 15:35 ` Dr. David Alan Gilbert
2019-06-07 18:11 ` [Qemu-devel] [Qemu-block] " Eric Blake
2019-06-07 16:48 ` [Qemu-devel] " no-reply
2019-06-07 20:42 ` no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190607163219.GO2631@work-vm \
--to=dgilbert@redhat.com \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.