From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, berrange@redhat.com, dgilbert@redhat.com,
qemu-block@nongnu.org
Subject: [Qemu-devel] [PATCH v2.1 02.5/11] monitor: Restrict use of Monitor member qmp to actual QMP monitors
Date: Wed, 12 Jun 2019 10:05:17 +0200 [thread overview]
Message-ID: <20190612080518.11597-1-armbru@redhat.com> (raw)
In-Reply-To: <20190611134043.9524-4-kwolf@redhat.com>
From: Kevin Wolf <kwolf@redhat.com>
We currently use Monitor member qmp even in HMP monitors. Harmless,
but it's in the next commit's way. Restrict its use to QMP monitors.
Several functions have a tacit "is a QMP monitor" precondition. Add
explicit assertions there. The next commit will replace most of them
by compile-time type checks.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
monitor.c | 34 ++++++++++++++++++++++++++++------
1 file changed, 28 insertions(+), 6 deletions(-)
diff --git a/monitor.c b/monitor.c
index bb23cc0450..0e145959d7 100644
--- a/monitor.c
+++ b/monitor.c
@@ -357,6 +357,8 @@ static void qmp_request_free(QMPRequest *req)
/* Caller must hold mon->qmp.qmp_queue_lock */
static void monitor_qmp_cleanup_req_queue_locked(Monitor *mon)
{
+ assert(monitor_is_qmp(mon));
+
while (!g_queue_is_empty(mon->qmp.qmp_requests)) {
qmp_request_free(g_queue_pop_head(mon->qmp.qmp_requests));
}
@@ -364,6 +366,8 @@ static void monitor_qmp_cleanup_req_queue_locked(Monitor *mon)
static void monitor_qmp_cleanup_queues(Monitor *mon)
{
+ assert(monitor_is_qmp(mon));
+
qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
monitor_qmp_cleanup_req_queue_locked(mon);
qemu_mutex_unlock(&mon->qmp.qmp_queue_lock);
@@ -710,29 +714,32 @@ static void monitor_data_init(Monitor *mon, int flags, bool skip_flush,
}
memset(mon, 0, sizeof(Monitor));
qemu_mutex_init(&mon->mon_lock);
- qemu_mutex_init(&mon->qmp.qmp_queue_lock);
mon->outbuf = qstring_new();
/* Use *mon_cmds by default. */
mon->cmd_table = mon_cmds;
mon->skip_flush = skip_flush;
mon->use_io_thread = use_io_thread;
- mon->qmp.qmp_requests = g_queue_new();
mon->flags = flags;
}
+static void monitor_data_destroy_qmp(Monitor *mon)
+{
+ json_message_parser_destroy(&mon->qmp.parser);
+ qemu_mutex_destroy(&mon->qmp.qmp_queue_lock);
+ monitor_qmp_cleanup_req_queue_locked(mon);
+ g_queue_free(mon->qmp.qmp_requests);
+}
+
static void monitor_data_destroy(Monitor *mon)
{
g_free(mon->mon_cpu_path);
qemu_chr_fe_deinit(&mon->chr, false);
if (monitor_is_qmp(mon)) {
- json_message_parser_destroy(&mon->qmp.parser);
+ monitor_data_destroy_qmp(mon);
}
readline_free(mon->rs);
qobject_unref(mon->outbuf);
qemu_mutex_destroy(&mon->mon_lock);
- qemu_mutex_destroy(&mon->qmp.qmp_queue_lock);
- monitor_qmp_cleanup_req_queue_locked(mon);
- g_queue_free(mon->qmp.qmp_requests);
}
char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
@@ -1086,6 +1093,7 @@ CommandInfoList *qmp_query_commands(Error **errp)
{
CommandInfoList *list = NULL;
+ assert(monitor_is_qmp(cur_mon));
qmp_for_each_command(cur_mon->qmp.commands, query_commands_cb, &list);
return list;
@@ -1155,11 +1163,13 @@ static void monitor_init_qmp_commands(void)
static bool qmp_oob_enabled(Monitor *mon)
{
+ assert(monitor_is_qmp(mon));
return mon->qmp.capab[QMP_CAPABILITY_OOB];
}
static void monitor_qmp_caps_reset(Monitor *mon)
{
+ assert(monitor_is_qmp(mon));
memset(mon->qmp.capab_offered, 0, sizeof(mon->qmp.capab_offered));
memset(mon->qmp.capab, 0, sizeof(mon->qmp.capab));
mon->qmp.capab_offered[QMP_CAPABILITY_OOB] = mon->use_io_thread;
@@ -1176,6 +1186,7 @@ static bool qmp_caps_accept(Monitor *mon, QMPCapabilityList *list,
GString *unavailable = NULL;
bool capab[QMP_CAPABILITY__MAX];
+ assert(monitor_is_qmp(mon));
memset(capab, 0, sizeof(capab));
for (; list; list = list->next) {
@@ -1203,6 +1214,7 @@ static bool qmp_caps_accept(Monitor *mon, QMPCapabilityList *list,
void qmp_qmp_capabilities(bool has_enable, QMPCapabilityList *enable,
Error **errp)
{
+ assert(monitor_is_qmp(cur_mon));
if (cur_mon->qmp.commands == &qmp_commands) {
error_set(errp, ERROR_CLASS_COMMAND_NOT_FOUND,
"Capabilities negotiation is already complete, command "
@@ -4134,6 +4146,7 @@ static void monitor_qmp_dispatch(Monitor *mon, QObject *req)
QDict *rsp;
QDict *error;
+ assert(monitor_is_qmp(mon));
old_mon = cur_mon;
cur_mon = mon;
@@ -4177,6 +4190,9 @@ static QMPRequest *monitor_qmp_requests_pop_any_with_lock(void)
qemu_mutex_lock(&monitor_lock);
QTAILQ_FOREACH(mon, &mon_list, entry) {
+ if (!monitor_is_qmp(mon)) {
+ continue;
+ }
qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
req_obj = g_queue_pop_head(mon->qmp.qmp_requests);
if (req_obj) {
@@ -4212,6 +4228,7 @@ static void monitor_qmp_bh_dispatcher(void *data)
}
mon = req_obj->mon;
+ assert(monitor_is_qmp(mon));
/* qmp_oob_enabled() might change after "qmp_capabilities" */
need_resume = !qmp_oob_enabled(mon) ||
mon->qmp.qmp_requests->length == QMP_REQ_QUEUE_LEN_MAX - 1;
@@ -4395,6 +4412,8 @@ static QDict *qmp_greeting(Monitor *mon)
QObject *ver = NULL;
QMPCapability cap;
+ assert(monitor_is_qmp(mon));
+
qmp_marshal_query_version(NULL, &ver, NULL);
for (cap = 0; cap < QMP_CAPABILITY__MAX; cap++) {
@@ -4612,6 +4631,9 @@ static void monitor_init_qmp(Chardev *chr, int flags)
monitor_data_init(mon, flags, false,
qemu_chr_has_feature(chr, QEMU_CHAR_FEATURE_GCONTEXT));
+ qemu_mutex_init(&mon->qmp.qmp_queue_lock);
+ mon->qmp.qmp_requests = g_queue_new();
+
qemu_chr_fe_init(&mon->chr, chr, &error_abort);
qemu_chr_fe_set_echo(&mon->chr, true);
--
2.21.0
next prev parent reply other threads:[~2019-06-12 8:09 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-11 13:40 [Qemu-devel] [PATCH v2 00/11] monitor: Split monitor.c in core/HMP/QMP/misc Kevin Wolf
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 01/11] monitor: Remove unused password prompting fields Kevin Wolf
2019-06-12 6:43 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 02/11] monitor: Split monitor_init in HMP and QMP function Kevin Wolf
2019-06-12 6:12 ` Markus Armbruster
2019-06-12 6:43 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 03/11] monitor: Make MonitorQMP a child class of Monitor Kevin Wolf
2019-06-12 7:59 ` Markus Armbruster
2019-06-12 11:28 ` Kevin Wolf
2019-06-12 14:18 ` Markus Armbruster
2019-06-12 8:05 ` Markus Armbruster [this message]
2019-06-12 8:05 ` [Qemu-devel] [PATCH v2.1 " Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 04/11] monitor: Create MonitorHMP with readline state Kevin Wolf
2019-06-12 9:07 ` Markus Armbruster
2019-06-12 9:54 ` Peter Xu
2019-06-12 10:03 ` Kevin Wolf
2019-06-12 14:08 ` Markus Armbruster
2019-06-12 14:10 ` Dr. David Alan Gilbert
2019-06-12 15:03 ` Kevin Wolf
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 05/11] monitor: Move cmd_table to MonitorHMP Kevin Wolf
2019-06-12 11:45 ` Markus Armbruster
2019-06-12 13:55 ` Kevin Wolf
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 06/11] Move monitor.c to monitor/misc.c Kevin Wolf
2019-06-11 15:38 ` Dr. David Alan Gilbert
2019-06-12 11:57 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 07/11] monitor: Move {hmp, qmp}.c to monitor/{hmp, qmp}-cmds.c Kevin Wolf
2019-06-11 16:09 ` Dr. David Alan Gilbert
2019-06-12 12:01 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 08/11] monitor: Create monitor_int.h with common definitions Kevin Wolf
2019-06-12 12:18 ` Markus Armbruster
2019-06-12 12:43 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 09/11] monitor: Split out monitor/qmp.c Kevin Wolf
2019-06-12 13:11 ` Markus Armbruster
2019-06-12 15:25 ` Kevin Wolf
2019-06-13 5:38 ` Markus Armbruster
2019-06-13 14:11 ` Kevin Wolf
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 10/11] monitor: Split out monitor/hmp.c Kevin Wolf
2019-06-12 13:17 ` Markus Armbruster
2019-06-12 15:31 ` Kevin Wolf
2019-06-13 5:44 ` Markus Armbruster
2019-06-11 13:40 ` [Qemu-devel] [PATCH v2 11/11] monitor: Split out monitor/monitor.c Kevin Wolf
2019-06-12 13:49 ` Markus Armbruster
2019-06-12 15:51 ` Kevin Wolf
2019-06-11 14:18 ` [Qemu-devel] [PATCH v2 00/11] monitor: Split monitor.c in core/HMP/QMP/misc no-reply
2019-06-11 15:24 ` no-reply
2019-06-12 14:22 ` Markus Armbruster
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=20190612080518.11597-1-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dgilbert@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).