qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 08/11] QMP: Asynchronous messages enable/disable sup


From: Luiz Capitulino
Subject: [Qemu-devel] [PATCH 08/11] QMP: Asynchronous messages enable/disable support
Date: Thu, 21 Jan 2010 19:09:37 -0200

This commit disables asynchronous messages by default and
introduces two new QMP commands: async_msg_enable and
async_msg_disable.

Each QMP Monitor has its own set of asynchronous messages,
so for example, if QEMU is run with two QMP Monitors async
messages setup in one of them doesn't affect the other.

To implement this design a bitmap is introduced to the
Monitor struct, each async message is represented by one bit.

Signed-off-by: Luiz Capitulino <address@hidden>
---
 monitor.c       |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 qemu-monitor.hx |   30 ++++++++++++++++++++++++++++++
 2 files changed, 78 insertions(+), 1 deletions(-)

diff --git a/monitor.c b/monitor.c
index 61c0273..321bc3a 100644
--- a/monitor.c
+++ b/monitor.c
@@ -108,11 +108,14 @@ typedef enum QMPMode {
     QMODE_HANDSHAKE,
 } QMPMode;
 
+#define EVENTS_BITMAP_SIZE (QEVENT_MAX / 8)
+
 typedef struct MonitorControl {
     QObject *id;
     QMPMode mode;
     int print_enabled;
     JSONMessageParser parser;
+    uint8_t events_bitmap[EVENTS_BITMAP_SIZE];
 } MonitorControl;
 
 struct Monitor {
@@ -318,6 +321,23 @@ static void monitor_protocol_emitter(Monitor *mon, QObject 
*data)
     QDECREF(qmp);
 }
 
+static void qevent_set(const Monitor *mon, int64_t event)
+{
+    assert(event >= 0 && event < QEVENT_MAX);
+    mon->mc->events_bitmap[event / 8] |= (1 << (event % 8));
+}
+
+static void qevent_unset(const Monitor *mon, int64_t event)
+{
+    assert(event >= 0 && event < QEVENT_MAX);
+    mon->mc->events_bitmap[event / 8] &= ~(1 << (event % 8));
+}
+
+static int qevent_enabled(const Monitor *mon, int64_t event)
+{
+    return (mon->mc->events_bitmap[event / 8] & (1 << (event % 8)));
+}
+
 static void timestamp_put(QDict *qdict)
 {
     int err;
@@ -389,7 +409,8 @@ void monitor_protocol_event(MonitorEvent event, QObject 
*data)
     }
 
     QLIST_FOREACH(mon, &mon_list, entry) {
-        if (monitor_ctrl_mode(mon)) {
+        if (monitor_ctrl_mode(mon) &&
+            qevent_enabled(mon, event)) {
             monitor_json_emitter(mon, QOBJECT(qmp));
         }
     }
@@ -465,6 +486,32 @@ static void do_commit(Monitor *mon, const QDict *qdict)
     }
 }
 
+static void qevent_set_value(Monitor *mon, const QDict *qdict, int value)
+{
+    int i;
+    const char *name = qdict_get_str(qdict, "name");
+
+    for (i = 0; monitor_events_names[i].name != NULL; i++) {
+        if (!strcmp(monitor_events_names[i].name, name)) {
+            return (value ? qevent_set(mon, i) : qevent_unset(mon, i));
+        }
+    }
+
+    qemu_error_new(QERR_ASYNC_MSG_NOT_FOUND, name);
+}
+
+static void do_async_msg_enable(Monitor *mon, const QDict *qdict,
+                                QObject **ret_data)
+{
+    qevent_set_value(mon, qdict, 1);
+}
+
+static void do_async_msg_disable(Monitor *mon, const QDict *qdict,
+                                 QObject **ret_data)
+{
+    qevent_set_value(mon, qdict, 0);
+}
+
 static void do_info(Monitor *mon, const QDict *qdict, QObject **ret_data)
 {
     const mon_cmd_t *cmd;
diff --git a/qemu-monitor.hx b/qemu-monitor.hx
index eebea09..0f3dfde 100644
--- a/qemu-monitor.hx
+++ b/qemu-monitor.hx
@@ -1077,6 +1077,36 @@ STEXI
 Switch QMP to @var{mode}
 ETEXI
 
+    {
+        .name       = "async_msg_enable",
+        .args_type  = "name:s",
+        .params     = "async_msg_enable name",
+        .help       = "enable an asynchronous message",
+        .flags      = HANDLER_HANDSHAKE_ONLY,
+        .user_print = monitor_user_noop,
+        .mhandler.cmd_new = do_async_msg_enable,
+    },
+
+STEXI
address@hidden async_msg_enable @var{name}
+Enable the asynchronous message @var{name}
+ETEXI
+
+    {
+        .name       = "async_msg_disable",
+        .args_type  = "name:s",
+        .params     = "async_msg_disable name",
+        .help       = "disable an asynchronous message",
+        .flags      = HANDLER_HANDSHAKE_ONLY,
+        .user_print = monitor_user_noop,
+        .mhandler.cmd_new = do_async_msg_disable,
+    },
+
+STEXI
address@hidden async_msg_disable @var{name}
+Disable the asynchronous message @var{name}
+ETEXI
+
 STEXI
 @end table
 ETEXI
-- 
1.6.6





reply via email to

[Prev in Thread] Current Thread [Next in Thread]