[Qemu-devel] [PATCH V5 03/28] qapi script: add event support

2014-04-30 Thread Wenchao Xia
qapi-event.py will parse the schema and generate qapi-event.c, then
the API in qapi-event.c can be used to handle event in qemu code.
All API have prefix "qapi_event".

The script mainly includes two parts: generate API for each event
define, generate an enum type for all defined events.

Since in some cases the real emit behavior may change, for example,
qemu-img would not send a event, a callback layer is used to
control the behavior. As a result, the stubs at compile time
can be saved, the binding of block layer code and monitor code
will become looser.

Signed-off-by: Wenchao Xia 
---
 Makefile |9 +-
 Makefile.objs|2 +-
 docs/qapi-code-gen.txt   |   18 ++
 scripts/qapi-event.py|  366 ++
 scripts/qapi.py  |   12 +
 tests/Makefile   |3 +-
 tests/qapi-schema/event-nest-struct.err  |1 +
 tests/qapi-schema/event-nest-struct.exit |1 +
 tests/qapi-schema/event-nest-struct.json |2 +
 9 files changed, 409 insertions(+), 5 deletions(-)
 create mode 100644 scripts/qapi-event.py
 create mode 100644 tests/qapi-schema/event-nest-struct.err
 create mode 100644 tests/qapi-schema/event-nest-struct.exit
 create mode 100644 tests/qapi-schema/event-nest-struct.json
 create mode 100644 tests/qapi-schema/event-nest-struct.out

diff --git a/Makefile b/Makefile
index 423e373..ed5b612 100644
--- a/Makefile
+++ b/Makefile
@@ -45,8 +45,8 @@ endif
 endif
 
 GENERATED_HEADERS = config-host.h qemu-options.def
-GENERATED_HEADERS += qmp-commands.h qapi-types.h qapi-visit.h
-GENERATED_SOURCES += qmp-marshal.c qapi-types.c qapi-visit.c
+GENERATED_HEADERS += qmp-commands.h qapi-types.h qapi-visit.h qapi-event.h
+GENERATED_SOURCES += qmp-marshal.c qapi-types.c qapi-visit.c qapi-event.c
 
 GENERATED_HEADERS += trace/generated-events.h
 GENERATED_SOURCES += trace/generated-events.c
@@ -208,7 +208,7 @@ Makefile: $(version-obj-y) $(version-lobj-y)
 # Build libraries
 
 libqemustub.a: $(stub-obj-y)
-libqemuutil.a: $(util-obj-y) qapi-types.o qapi-visit.o
+libqemuutil.a: $(util-obj-y) qapi-types.o qapi-visit.o qapi-event.o
 
 block-modules = $(foreach o,$(block-obj-m),"$(basename $(subst /,-,$o))",) NULL
 util/module.o-cflags = -D'CONFIG_BLOCK_MODULES=$(block-modules)'
@@ -252,6 +252,9 @@ $(SRC_PATH)/qapi-schema.json 
$(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
 qapi-visit.c qapi-visit.h :\
 $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py 
$(gen-out-type) -o "." -b < $<, "  GEN   $@")
+qapi-event.c qapi-event.h :\
+$(SRC_PATH)/qapi-schema.json $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
+   $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-event.py 
$(gen-out-type) -o "." -b < $<, "  GEN   $@")
 qmp-commands.h qmp-marshal.c :\
 $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py 
$(gen-out-type) -m -o "." < $<, "  GEN   $@")
diff --git a/Makefile.objs b/Makefile.objs
index a6e0e2a..93697a1 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -12,7 +12,7 @@ block-obj-y += main-loop.o iohandler.o qemu-timer.o
 block-obj-$(CONFIG_POSIX) += aio-posix.o
 block-obj-$(CONFIG_WIN32) += aio-win32.o
 block-obj-y += block/
-block-obj-y += qapi-types.o qapi-visit.o
+block-obj-y += qapi-types.o qapi-visit.o qapi-event.o
 block-obj-y += qemu-io-cmds.o
 
 block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o qemu-coroutine-io.o
diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt
index d78921f..91e4e13 100644
--- a/docs/qapi-code-gen.txt
+++ b/docs/qapi-code-gen.txt
@@ -180,6 +180,24 @@ An example command is:
'data': { 'arg1': 'str', '*arg2': 'str' },
'returns': 'str' }
 
+=== Events ===
+
+Events are defined with key word 'event'.  When 'data' is also specified,
+additional info will be carried on.  Finally there will be C API generated
+in qapi-event.h, and when called by QEMU code, a message with timestamp will
+be emitted on the wire.  If timestamp is -1, it means failure to retrieve host
+time.
+
+An example event is:
+
+{ 'event': 'EVENT_C',
+  'data': { '*a': 'int', 'b': 'str' } }
+
+Resulting in this JSON object:
+
+{ "event": "EVENT_C",
+  "data": { "b": "test string" },
+  "timestamp": { "seconds": 1267020223, "microseconds": 435656 } }
 
 == Code generation ==
 
diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py
new file mode 100644
index 000..501baff
--- /dev/null
+++ b/scripts/qapi-event.py
@@ -0,0 +1,366 @@
+#
+# QAPI event generator
+#
+# Copyright (c) 2014 Wenchao Xia
+#
+# Authors:
+#  Wenchao Xia 
+#
+# This work is licensed under the terms of the GNU GPL, version 2.
+# See the COPYING file in the top-level directory.
+
+from ordereddict import OrderedDict
+from qapi import *
+import sys
+import os
+import getopt
+im

Re: [Qemu-devel] [PATCH V5 03/28] qapi script: add event support

2014-05-01 Thread Eric Blake
On 04/30/2014 10:26 PM, Wenchao Xia wrote:
> qapi-event.py will parse the schema and generate qapi-event.c, then
> the API in qapi-event.c can be used to handle event in qemu code.
> All API have prefix "qapi_event".
> 
> The script mainly includes two parts: generate API for each event
> define, generate an enum type for all defined events.
> 
> Since in some cases the real emit behavior may change, for example,
> qemu-img would not send a event, a callback layer is used to
> control the behavior. As a result, the stubs at compile time
> can be saved, the binding of block layer code and monitor code
> will become looser.
> 
> Signed-off-by: Wenchao Xia 
> ---

> @@ -252,6 +252,9 @@ $(SRC_PATH)/qapi-schema.json 
> $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
>  qapi-visit.c qapi-visit.h :\
>  $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
>   $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py 
> $(gen-out-type) -o "." -b < $<, "  GEN   $@")
> +qapi-event.c qapi-event.h :\
> +$(SRC_PATH)/qapi-schema.json $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
> + $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-event.py 
> $(gen-out-type) -o "." -b < $<, "  GEN   $@")

Long lines; I think you should rebase atop Lluís series.


> +
> +/* Fake visit, as if all member are under a structure */
> +visit_start_struct(v, NULL, "", "%(event_name)s", 0, &local_err);
> +if (error_is_set(&local_err)) {
> +goto clean;
> +}

s/error_is_set(&local_err)/local_err/ here and elsewhere.  We are
getting rid of error_is_set.

> +
> +# Start the real job
> +
> +try:
> +opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:o:",
> +   ["source", "header", "builtins", 
> "prefix=",
> +"output-dir="])

Another reason to rebase atop Lluís work: this should take the input
file name as a parameter rather than reading stdin.

-- 
Eric Blake   eblake redhat com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature


Re: [Qemu-devel] [PATCH V5 03/28] qapi script: add event support

2014-05-02 Thread Markus Armbruster
Eric Blake  writes:

> On 04/30/2014 10:26 PM, Wenchao Xia wrote:
>> qapi-event.py will parse the schema and generate qapi-event.c, then
>> the API in qapi-event.c can be used to handle event in qemu code.
>> All API have prefix "qapi_event".
>> 
>> The script mainly includes two parts: generate API for each event
>> define, generate an enum type for all defined events.
>> 
>> Since in some cases the real emit behavior may change, for example,
>> qemu-img would not send a event, a callback layer is used to
>> control the behavior. As a result, the stubs at compile time
>> can be saved, the binding of block layer code and monitor code
>> will become looser.
>> 
>> Signed-off-by: Wenchao Xia 
>> ---
>
>> @@ -252,6 +252,9 @@ $(SRC_PATH)/qapi-schema.json 
>> $(SRC_PATH)/scripts/qapi-types.py $(qapi-py)
>>  qapi-visit.c qapi-visit.h :\
>>  $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/scripts/qapi-visit.py $(qapi-py)
>>  $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py 
>> $(gen-out-type) -o "." -b < $<, "  GEN   $@")
>> +qapi-event.c qapi-event.h :\
>> +$(SRC_PATH)/qapi-schema.json $(SRC_PATH)/scripts/qapi-event.py $(qapi-py)
>> +$(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-event.py 
>> $(gen-out-type) -o "." -b < $<, "  GEN   $@")
>
> Long lines; I think you should rebase atop Lluís series.

This one: "qapi: Allow modularization of QAPI schema files".  v9 looked
committable to me, but Lluís decided to address minor review comments
right away.  I haven't reviewed his v10, yet, but I expect it to be the
final one.

>> +
>> +/* Fake visit, as if all member are under a structure */
>> +visit_start_struct(v, NULL, "", "%(event_name)s", 0, &local_err);
>> +if (error_is_set(&local_err)) {
>> +goto clean;
>> +}
>
> s/error_is_set(&local_err)/local_err/ here and elsewhere.  We are
> getting rid of error_is_set.

Yes, please!

>> +
>> +# Start the real job
>> +
>> +try:
>> +opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:o:",
>> + ["source", "header", "builtins", "prefix=",
>> +"output-dir="])
>
> Another reason to rebase atop Lluís work: this should take the input
> file name as a parameter rather than reading stdin.