提交 0d1ea871 编写于 作者: L Luiz Capitulino 提交者: Anthony Liguori

QMP: Asynchronous events infrastructure

Asynchronous events are generated with a call to
monitor_protocol_event().

This function builds the right data-type and emit the event
right away. The emitted data is always a JSON object and its
format is as follows:

{ "event": json-string,
  "timestamp": { "seconds": json-number, "microseconds": json-number },
  "data": json-value }

This design is based on ideas by Amit Shah <amit.shah@redhat.com>.
Signed-off-by: NLuiz Capitulino <lcapitulino@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 5e23f480
...@@ -307,6 +307,56 @@ static void monitor_protocol_emitter(Monitor *mon, QObject *data) ...@@ -307,6 +307,56 @@ static void monitor_protocol_emitter(Monitor *mon, QObject *data)
QDECREF(qmp); QDECREF(qmp);
} }
static void timestamp_put(QDict *qdict)
{
int err;
QObject *obj;
struct timeval tv;
err = gettimeofday(&tv, NULL);
if (err < 0)
return;
obj = qobject_from_jsonf("{ 'seconds': %" PRId64 ", "
"'microseconds': %" PRId64 " }",
(int64_t) tv.tv_sec, (int64_t) tv.tv_usec);
assert(obj != NULL);
qdict_put_obj(qdict, "timestamp", obj);
}
/**
* monitor_protocol_event(): Generate a Monitor event
*
* Event-specific data can be emitted through the (optional) 'data' parameter.
*/
void monitor_protocol_event(MonitorEvent event, QObject *data)
{
QDict *qmp;
const char *event_name;
Monitor *mon = cur_mon;
assert(event < EVENT_MAX);
if (!monitor_ctrl_mode(mon))
return;
switch (event) {
default:
abort();
break;
}
qmp = qdict_new();
timestamp_put(qmp);
qdict_put(qmp, "event", qstring_from_str(event_name));
if (data)
qdict_put_obj(qmp, "data", data);
monitor_json_emitter(mon, QOBJECT(qmp));
QDECREF(qmp);
}
static int compare_cmd(const char *name, const char *list) static int compare_cmd(const char *name, const char *list)
{ {
const char *p, *pstart; const char *p, *pstart;
......
...@@ -13,6 +13,12 @@ extern Monitor *cur_mon; ...@@ -13,6 +13,12 @@ extern Monitor *cur_mon;
#define MONITOR_USE_READLINE 0x02 #define MONITOR_USE_READLINE 0x02
#define MONITOR_USE_CONTROL 0x04 #define MONITOR_USE_CONTROL 0x04
/* QMP events */
typedef enum MonitorEvent {
EVENT_MAX,
} MonitorEvent;
void monitor_protocol_event(MonitorEvent event, QObject *data);
const char *monitor_cmdline_parse(const char *cmdline, int *flags); const char *monitor_cmdline_parse(const char *cmdline, int *flags);
void monitor_init(CharDriverState *chr, int flags); void monitor_init(CharDriverState *chr, int flags);
......
...@@ -56,6 +56,10 @@ int get_async_context_id(void) ...@@ -56,6 +56,10 @@ int get_async_context_id(void)
return 0; return 0;
} }
void monitor_protocol_event(MonitorEvent event, QObject *data)
{
}
QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque) QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
{ {
QEMUBH *bh; QEMUBH *bh;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册