[Top][All Lists]

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

Re: [Qemu-devel] [RFC PATCH v2 02/15] qapi: Eliminate indirection throug

From: Eric Blake
Subject: Re: [Qemu-devel] [RFC PATCH v2 02/15] qapi: Eliminate indirection through qmp_event_get_func_emit()
Date: Tue, 18 Dec 2018 13:56:23 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.1

On 12/18/18 12:22 PM, Markus Armbruster wrote:
The qapi_event_send_FOO() functions emit events like this:

     QMPEventFuncEmit emit;

     emit = qmp_event_get_func_emit();
     if (!emit) {

     emit(QAPI_EVENT_FOO, qmp);

More seriously: how does this work even now?  qemu-system-FOO wants
QAPIEvent, and passes a function taking that to
qmp_event_set_func_emit().  test-qmp-event wants test_QAPIEvent, and
passes a function taking that to qmp_event_set_func_emit().

I works by type trickery, of course:


     typedef void (*QMPEventFuncEmit)(unsigned event, QDict *dict);

     void qmp_event_set_func_emit(QMPEventFuncEmit emit);

     QMPEventFuncEmit qmp_event_get_func_emit(void);

We use unsigned instead of the enumeration type.  Relies on both
enumerations boiling down to unsigned, which happens to be true for
the compilers we use.

Clean this up as follows:

* Generate qapi_event_send_FOO() that call PREFIX_qapi_event_emit()
   instead of the value of qmp_event_set_func_emit().

* Generate a prototype for PREFIX_qapi_event_emit() into

* PREFIX_ is empty for qapi/qapi-schema.json, and test_ for
   tests/qapi-schema/qapi-schema-test.json.  It's qga_ for
   qga/qapi-schema.json, and doc-good- for
   tests/qapi-schema/doc-good-qapi-doc.texi, but those don't define any

Wait - PREFIX is qga_ or doc_good_...

* Add a qapi_event_emit() that does nothing to stubs/monitor.c.  This
   takes care of all other programs that link code emitting QMP events.

...but the stub function is defined without a prefix?

+++ b/stubs/monitor.c
@@ -1,5 +1,6 @@
  #include "qemu/osdep.h"
  #include "qapi/error.h"
+#include "qapi/qapi-events.h"
  #include "qemu-common.h"
  #include "monitor/monitor.h"
@@ -14,3 +15,7 @@ int monitor_get_fd(Monitor *mon, const char *name, Error **errp)
  void monitor_init(Chardev *chr, int flags)
+void qapi_event_emit(QAPIEvent event, QDict *qdict)
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

reply via email to

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