[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 29/29] Add 'query-events' command to QMP to query as
From: |
Luiz Capitulino |
Subject: |
[Qemu-devel] [PATCH 29/29] Add 'query-events' command to QMP to query async events |
Date: |
Tue, 5 Jun 2012 14:25:08 -0300 |
From: "Daniel P. Berrange" <address@hidden>
Sometimes it is neccessary for an application to determine
whether a particular QMP event is available, so they can
decide whether to use compatibility code instead. This
introduces a new 'query-events' command to QMP to do just
that
{ "execute": "query-events" }
{"return": [{"name": "WAKEUP"},
{"name": "SUSPEND"},
{"name": "DEVICE_TRAY_MOVED"},
{"name": "BLOCK_JOB_CANCELLED"},
{"name": "BLOCK_JOB_COMPLETED"},
...snip...
{"name": "SHUTDOWN"}]}
* monitor.c: Turn MonitorEvent -> string conversion
into a lookup from a static table of constant strings.
Add impl of qmp_query_events monitor command handler
* qapi-schema.json, qmp-commands.hx: Define contract of
query-events command
Signed-off-by: Daniel P. Berrange <address@hidden>
Signed-off-by: Luiz Capitulino <address@hidden>
---
monitor.c | 107 +++++++++++++++++++++++--------------------------------
monitor.h | 4 +++
qapi-schema.json | 22 ++++++++++++
qmp-commands.hx | 37 +++++++++++++++++++
4 files changed, 108 insertions(+), 62 deletions(-)
diff --git a/monitor.c b/monitor.c
index 12a6fe2..a3bc2c7 100644
--- a/monitor.c
+++ b/monitor.c
@@ -422,6 +422,30 @@ static void timestamp_put(QDict *qdict)
qdict_put_obj(qdict, "timestamp", obj);
}
+
+static const char *monitor_event_names[] = {
+ [QEVENT_SHUTDOWN] = "SHUTDOWN",
+ [QEVENT_RESET] = "RESET",
+ [QEVENT_POWERDOWN] = "POWERDOWN",
+ [QEVENT_STOP] = "STOP",
+ [QEVENT_RESUME] = "RESUME",
+ [QEVENT_VNC_CONNECTED] = "VNC_CONNECTED",
+ [QEVENT_VNC_INITIALIZED] = "VNC_INITIALIZED",
+ [QEVENT_VNC_DISCONNECTED] = "VNC_DISCONNECTED",
+ [QEVENT_BLOCK_IO_ERROR] = "BLOCK_IO_ERROR",
+ [QEVENT_RTC_CHANGE] = "RTC_CHANGE",
+ [QEVENT_WATCHDOG] = "WATCHDOG",
+ [QEVENT_SPICE_CONNECTED] = "SPICE_CONNECTED",
+ [QEVENT_SPICE_INITIALIZED] = "SPICE_INITIALIZED",
+ [QEVENT_SPICE_DISCONNECTED] = "SPICE_DISCONNECTED",
+ [QEVENT_BLOCK_JOB_COMPLETED] = "BLOCK_JOB_COMPLETED",
+ [QEVENT_BLOCK_JOB_CANCELLED] = "BLOCK_JOB_CANCELLED",
+ [QEVENT_DEVICE_TRAY_MOVED] = "DEVICE_TRAY_MOVED",
+ [QEVENT_SUSPEND] = "SUSPEND",
+ [QEVENT_WAKEUP] = "WAKEUP",
+};
+QEMU_BUILD_BUG_ON(ARRAY_SIZE(monitor_event_names) != QEVENT_MAX)
+
/**
* monitor_protocol_event(): Generate a Monitor event
*
@@ -435,68 +459,8 @@ void monitor_protocol_event(MonitorEvent event, QObject
*data)
assert(event < QEVENT_MAX);
- switch (event) {
- case QEVENT_SHUTDOWN:
- event_name = "SHUTDOWN";
- break;
- case QEVENT_RESET:
- event_name = "RESET";
- break;
- case QEVENT_POWERDOWN:
- event_name = "POWERDOWN";
- break;
- case QEVENT_STOP:
- event_name = "STOP";
- break;
- case QEVENT_RESUME:
- event_name = "RESUME";
- break;
- case QEVENT_VNC_CONNECTED:
- event_name = "VNC_CONNECTED";
- break;
- case QEVENT_VNC_INITIALIZED:
- event_name = "VNC_INITIALIZED";
- break;
- case QEVENT_VNC_DISCONNECTED:
- event_name = "VNC_DISCONNECTED";
- break;
- case QEVENT_BLOCK_IO_ERROR:
- event_name = "BLOCK_IO_ERROR";
- break;
- case QEVENT_RTC_CHANGE:
- event_name = "RTC_CHANGE";
- break;
- case QEVENT_WATCHDOG:
- event_name = "WATCHDOG";
- break;
- case QEVENT_SPICE_CONNECTED:
- event_name = "SPICE_CONNECTED";
- break;
- case QEVENT_SPICE_INITIALIZED:
- event_name = "SPICE_INITIALIZED";
- break;
- case QEVENT_SPICE_DISCONNECTED:
- event_name = "SPICE_DISCONNECTED";
- break;
- case QEVENT_BLOCK_JOB_COMPLETED:
- event_name = "BLOCK_JOB_COMPLETED";
- break;
- case QEVENT_BLOCK_JOB_CANCELLED:
- event_name = "BLOCK_JOB_CANCELLED";
- break;
- case QEVENT_DEVICE_TRAY_MOVED:
- event_name = "DEVICE_TRAY_MOVED";
- break;
- case QEVENT_SUSPEND:
- event_name = "SUSPEND";
- break;
- case QEVENT_WAKEUP:
- event_name = "WAKEUP";
- break;
- default:
- abort();
- break;
- }
+ event_name = monitor_event_names[event];
+ assert(event_name != NULL);
qmp = qdict_new();
timestamp_put(qmp);
@@ -738,6 +702,25 @@ CommandInfoList *qmp_query_commands(Error **errp)
return cmd_list;
}
+EventInfoList *qmp_query_events(Error **errp)
+{
+ EventInfoList *info, *ev_list = NULL;
+ MonitorEvent e;
+
+ for (e = 0 ; e < QEVENT_MAX ; e++) {
+ const char *event_name = monitor_event_names[e];
+ assert(event_name != NULL);
+ info = g_malloc0(sizeof(*info));
+ info->value = g_malloc0(sizeof(*info->value));
+ info->value->name = g_strdup(event_name);
+
+ info->next = ev_list;
+ ev_list = info;
+ }
+
+ return ev_list;
+}
+
/* set the current CPU defined by the user */
int monitor_set_cpu(int cpu_index)
{
diff --git a/monitor.h b/monitor.h
index 0d49800..cd1d878 100644
--- a/monitor.h
+++ b/monitor.h
@@ -41,6 +41,10 @@ typedef enum MonitorEvent {
QEVENT_DEVICE_TRAY_MOVED,
QEVENT_SUSPEND,
QEVENT_WAKEUP,
+
+ /* Add to 'monitor_event_names' array in monitor.c when
+ * defining new events here */
+
QEVENT_MAX,
} MonitorEvent;
diff --git a/qapi-schema.json b/qapi-schema.json
index bb1f806..3b6e346 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -228,6 +228,28 @@
{ 'command': 'query-commands', 'returns': ['CommandInfo'] }
##
+# @EventInfo:
+#
+# Information about a QMP event
+#
+# @name: The event name
+#
+# Since: 1.2.0
+##
+{ 'type': 'EventInfo', 'data': {'name': 'str'} }
+
+##
+# @query-events:
+#
+# Return a list of supported QMP events by this server
+#
+# Returns: A list of @EventInfo for all supported events
+#
+# Since: 1.2.0
+##
+{ 'command': 'query-events', 'returns': ['EventInfo'] }
+
+##
# @MigrationStats
#
# Detailed migration status.
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 57ea803..2e1a38e 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -1209,6 +1209,43 @@ EQMP
},
SQMP
+query-events
+--------------
+
+List QMP available events.
+
+Each event is represented by a json-object, the returned value is a json-array
+of all events.
+
+Each json-object contains:
+
+- "name": event's name (json-string)
+
+Example:
+
+-> { "execute": "query-events" }
+<- {
+ "return":[
+ {
+ "name":"SHUTDOWN"
+ },
+ {
+ "name":"RESET"
+ }
+ ]
+ }
+
+Note: This example has been shortened as the real response is too long.
+
+EQMP
+
+ {
+ .name = "query-events",
+ .args_type = "",
+ .mhandler.cmd_new = qmp_marshal_input_query_events,
+ },
+
+SQMP
query-chardev
-------------
--
1.7.10.2.565.gbd578b5
- [Qemu-devel] [PATCH 08/29] target-i386: Add API to write cpu status to core file, (continued)
- [Qemu-devel] [PATCH 08/29] target-i386: Add API to write cpu status to core file, Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 07/29] target-i386: Add API to write elf notes to core file, Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 11/29] make gdb_id() generally avialable and rename it to cpu_index(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 10/29] target-i386: Add API to get note's size, Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 18/29] qemu-option: qemu_opts_validate(): use error_set(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 16/29] qemu-option: parse_option_size(): use error_set(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 20/29] qemu-option: introduce qemu_opt_set_err(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 25/29] net: purge the monitor object from all init functions, Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 22/29] qerror: introduce QERR_INVALID_OPTION_GROUP, Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 24/29] qemu-config: introduce qemu_find_opts_err(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 29/29] Add 'query-events' command to QMP to query async events,
Luiz Capitulino <=
- [Qemu-devel] [PATCH 28/29] qapi: convert netdev_del, Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 27/29] qapi: convert netdev_add, Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 15/29] qemu-option: parse_option_bool(): use error_set(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 23/29] qemu-config: find_list(): use error_set(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 19/29] qemu-option: opt_set(): use error_set(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 17/29] qemu-option: qemu_opt_parse(): use error_set(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 21/29] qemu-option: qemu_opts_from_qdict(): use error_set(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 14/29] qemu-option: parse_option_number(): use error_set(), Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 12/29] introduce a new monitor command 'dump-guest-memory' to dump guest's memory, Luiz Capitulino, 2012/06/05
- [Qemu-devel] [PATCH 26/29] net: net_client_init(): use error_set(), Luiz Capitulino, 2012/06/05