[libvirt] [PATCH 0/7 v2] Misc improvements to events code

From: "Daniel P. Berrange" <berrange@redhat.com> This is a followup to the recent network events patches to improve a few things I noticed when testing this out for real. In v2: - Changed the way event dispatch works to avoid race with creation of classes Daniel P. Berrange (7): Move examples/domain-events/event-c to examples/object-events Update event demo program to support network events too Add 'detail' arg to network lifecycle event internals Introduce abstract virNetworkEvent class Associate a dispatch function with the event objects Remove the event namespace concept Add debug output when registering event handlers Makefile.am | 2 +- configure.ac | 2 +- .../events-c => object-events}/Makefile.am | 0 .../events-c => object-events}/event-test.c | 45 ++++++++++- src/conf/domain_event.c | 27 +++++-- src/conf/domain_event.h | 7 -- src/conf/network_event.c | 59 ++++++++++---- src/conf/network_event.h | 9 +-- src/conf/object_event.c | 94 +++++++++------------- src/conf/object_event.h | 11 +-- src/conf/object_event_private.h | 11 ++- src/network/bridge_driver.c | 15 ++-- src/remote/remote_driver.c | 2 +- src/test/test_driver.c | 15 ++-- 14 files changed, 182 insertions(+), 117 deletions(-) rename examples/{domain-events/events-c => object-events}/Makefile.am (100%) rename examples/{domain-events/events-c => object-events}/event-test.c (94%) -- 1.8.3.1

From: "Daniel P. Berrange" <berrange@redhat.com> The domain events demo program isn't really tied to domain events anymore, so rename it to object events. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Makefile.am | 2 +- configure.ac | 2 +- examples/{domain-events/events-c => object-events}/Makefile.am | 0 examples/{domain-events/events-c => object-events}/event-test.c | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename examples/{domain-events/events-c => object-events}/Makefile.am (100%) rename examples/{domain-events/events-c => object-events}/event-test.c (100%) diff --git a/Makefile.am b/Makefile.am index 2cbf71a..88c7073 100644 --- a/Makefile.am +++ b/Makefile.am @@ -20,7 +20,7 @@ LCOV = lcov GENHTML = genhtml SUBDIRS = . gnulib/lib include src daemon tools docs gnulib/tests \ - tests po examples/domain-events/events-c examples/hellolibvirt \ + tests po examples/object-events examples/hellolibvirt \ examples/dominfo examples/apparmor examples/xml/nwfilter \ examples/openauth examples/systemtap diff --git a/configure.ac b/configure.ac index bb92349..10ce184 100644 --- a/configure.ac +++ b/configure.ac @@ -2554,7 +2554,7 @@ AC_CONFIG_FILES([\ tools/Makefile \ tests/Makefile \ examples/apparmor/Makefile \ - examples/domain-events/events-c/Makefile \ + examples/object-events/Makefile \ examples/dominfo/Makefile \ examples/openauth/Makefile \ examples/hellolibvirt/Makefile \ diff --git a/examples/domain-events/events-c/Makefile.am b/examples/object-events/Makefile.am similarity index 100% rename from examples/domain-events/events-c/Makefile.am rename to examples/object-events/Makefile.am diff --git a/examples/domain-events/events-c/event-test.c b/examples/object-events/event-test.c similarity index 100% rename from examples/domain-events/events-c/event-test.c rename to examples/object-events/event-test.c -- 1.8.3.1

On Thu, Dec 12, 2013 at 06:04:01PM +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The domain events demo program isn't really tied to domain events anymore, so rename it to object events.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Makefile.am | 2 +- configure.ac | 2 +- examples/{domain-events/events-c => object-events}/Makefile.am | 0 examples/{domain-events/events-c => object-events}/event-test.c | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename examples/{domain-events/events-c => object-events}/Makefile.am (100%) rename examples/{domain-events/events-c => object-events}/event-test.c (100%)
ACK, Martin

On Fri, Dec 13, 2013 at 11:07:57AM +0100, Martin Kletzander wrote:
On Thu, Dec 12, 2013 at 06:04:01PM +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The domain events demo program isn't really tied to domain events anymore, so rename it to object events.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Makefile.am | 2 +- configure.ac | 2 +- examples/{domain-events/events-c => object-events}/Makefile.am | 0 examples/{domain-events/events-c => object-events}/event-test.c | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename examples/{domain-events/events-c => object-events}/Makefile.am (100%) rename examples/{domain-events/events-c => object-events}/event-test.c (100%)
ACK,
Martin
Spoke too soon, please squash this in: diff --git a/.gitignore b/.gitignore index 2d364dc..216509e 100644 --- a/.gitignore +++ b/.gitignore @@ -69,7 +69,7 @@ /docs/libvirt-refs.xml /docs/search.php /docs/todo.html.in -/examples/domain-events/events-c/event-test +/examples/domain-events/event-test /examples/dominfo/info1 /examples/hellolibvirt/hellolibvirt /examples/openauth/openauth -- Martin

On Thu, 2013-12-12 at 18:04 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The domain events demo program isn't really tied to domain events anymore, so rename it to object events.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Makefile.am | 2 +- configure.ac | 2 +- examples/{domain-events/events-c => object-events}/Makefile.am | 0 examples/{domain-events/events-c => object-events}/event-test.c | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename examples/{domain-events/events-c => object-events}/Makefile.am (100%) rename examples/{domain-events/events-c => object-events}/event-test.c (100%)
As mentioned by Michal in his mail, that commit would need the changes for .gitignore, spec file and cfg.mk. ACK with those changes. -- Cedric

On 12.12.2013 19:04, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The domain events demo program isn't really tied to domain events anymore, so rename it to object events.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Makefile.am | 2 +- configure.ac | 2 +- examples/{domain-events/events-c => object-events}/Makefile.am | 0 examples/{domain-events/events-c => object-events}/event-test.c | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename examples/{domain-events/events-c => object-events}/Makefile.am (100%) rename examples/{domain-events/events-c => object-events}/event-test.c (100%)
Shorter diff. A lot shorter. Anyway, still missing the spec file and cfg.mk update. Funny, the sc_prohibit_asprintf rule exception is not needed anyway since there's no asprintf in the vent-test.c. ACK once you fix the spec file and cfg.mk Michal

On Fri, Dec 13, 2013 at 11:22:31AM +0100, Michal Privoznik wrote:
On 12.12.2013 19:04, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The domain events demo program isn't really tied to domain events anymore, so rename it to object events.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- Makefile.am | 2 +- configure.ac | 2 +- examples/{domain-events/events-c => object-events}/Makefile.am | 0 examples/{domain-events/events-c => object-events}/event-test.c | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename examples/{domain-events/events-c => object-events}/Makefile.am (100%) rename examples/{domain-events/events-c => object-events}/event-test.c (100%)
Shorter diff. A lot shorter. Anyway, still missing the spec file and cfg.mk update. Funny, the sc_prohibit_asprintf rule exception is not needed anyway since there's no asprintf in the vent-test.c.
Yeah, this code was changed a while ago
ACK once you fix the spec file and cfg.mk
Will do. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

From: "Daniel P. Berrange" <berrange@redhat.com> --- examples/object-events/event-test.c | 45 +++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 52aa3d0..6a279cf 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -223,6 +223,27 @@ static const char *eventDetailToString(int event, int detail) { return ret; } +static const char * +networkEventToString(int event) +{ + const char *ret = ""; + switch ((virNetworkEventLifecycleType) event) { + case VIR_NETWORK_EVENT_DEFINED: + ret ="Defined"; + break; + case VIR_NETWORK_EVENT_UNDEFINED: + ret ="Undefined"; + break; + case VIR_NETWORK_EVENT_STARTED: + ret ="Started"; + break; + case VIR_NETWORK_EVENT_STOPPED: + ret ="Stopped"; + break; + } + return ret; +} + static int myDomainEventCallback1(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, int event, @@ -432,6 +453,18 @@ myDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } +static int myNetworkEventCallback2(virConnectPtr conn ATTRIBUTE_UNUSED, + virNetworkPtr dom, + int event, + int detail, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Network %s %s %d\n", __func__, virNetworkGetName(dom), + networkEventToString(event), detail); + return 0; +} + + static void myFreeFunc(void *opaque) { char *str = opaque; @@ -472,6 +505,7 @@ int main(int argc, char **argv) int callback13ret = -1; int callback14ret = -1; int callback15ret = -1; + int callback16ret = -1; struct sigaction action_stop; memset(&action_stop, 0, sizeof(action_stop)); @@ -510,7 +544,7 @@ int main(int argc, char **argv) sigaction(SIGTERM, &action_stop, NULL); sigaction(SIGINT, &action_stop, NULL); - VIR_DEBUG("Registering domain event cbs"); + VIR_DEBUG("Registering event cbs"); /* Add 2 callbacks to prove this works with more than just one */ callback1ret = virConnectDomainEventRegister(dconn, myDomainEventCallback1, @@ -585,6 +619,11 @@ int main(int argc, char **argv) VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDeviceRemovedCallback), strdup("device removed"), myFreeFunc); + callback16ret = virConnectNetworkEventRegisterAny(dconn, + NULL, + VIR_NETWORK_EVENT_ID_LIFECYCLE, + VIR_NETWORK_EVENT_CALLBACK(myNetworkEventCallback2), + strdup("callback 2"), myFreeFunc); if ((callback1ret != -1) && (callback2ret != -1) && @@ -599,7 +638,8 @@ int main(int argc, char **argv) (callback12ret != -1) && (callback13ret != -1) && (callback14ret != -1) && - (callback15ret != -1)) { + (callback15ret != -1) && + (callback16ret != -1)) { if (virConnectSetKeepAlive(dconn, 5, 3) < 0) { virErrorPtr err = virGetLastError(); fprintf(stderr, "Failed to start keepalive protocol: %s\n", @@ -630,6 +670,7 @@ int main(int argc, char **argv) virConnectDomainEventDeregisterAny(dconn, callback13ret); virConnectDomainEventDeregisterAny(dconn, callback14ret); virConnectDomainEventDeregisterAny(dconn, callback15ret); + virConnectNetworkEventDeregisterAny(dconn, callback16ret); if (callback8ret != -1) virConnectDomainEventDeregisterAny(dconn, callback8ret); } -- 1.8.3.1

On Thu, Dec 12, 2013 at 06:04:02PM +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
--- examples/object-events/event-test.c | 45 +++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-)
ACK, Martin

On 12.12.2013 19:04, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
--- examples/object-events/event-test.c | 45 +++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-)
diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 52aa3d0..6a279cf 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -223,6 +223,27 @@ static const char *eventDetailToString(int event, int detail) { return ret; }
+static const char * +networkEventToString(int event) +{ + const char *ret = ""; + switch ((virNetworkEventLifecycleType) event) { + case VIR_NETWORK_EVENT_DEFINED: + ret ="Defined"; + break; + case VIR_NETWORK_EVENT_UNDEFINED: + ret ="Undefined"; + break; + case VIR_NETWORK_EVENT_STARTED: + ret ="Started"; + break; + case VIR_NETWORK_EVENT_STOPPED: + ret ="Stopped"; + break; + } + return ret; +} + static int myDomainEventCallback1(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainPtr dom, int event, @@ -432,6 +453,18 @@ myDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; }
+static int myNetworkEventCallback2(virConnectPtr conn ATTRIBUTE_UNUSED, + virNetworkPtr dom, + int event, + int detail, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Network %s %s %d\n", __func__, virNetworkGetName(dom), + networkEventToString(event), detail); + return 0; +} + + static void myFreeFunc(void *opaque) { char *str = opaque; @@ -472,6 +505,7 @@ int main(int argc, char **argv) int callback13ret = -1; int callback14ret = -1; int callback15ret = -1; + int callback16ret = -1; struct sigaction action_stop;
memset(&action_stop, 0, sizeof(action_stop)); @@ -510,7 +544,7 @@ int main(int argc, char **argv) sigaction(SIGTERM, &action_stop, NULL); sigaction(SIGINT, &action_stop, NULL);
- VIR_DEBUG("Registering domain event cbs"); + VIR_DEBUG("Registering event cbs");
/* Add 2 callbacks to prove this works with more than just one */ callback1ret = virConnectDomainEventRegister(dconn, myDomainEventCallback1, @@ -585,6 +619,11 @@ int main(int argc, char **argv) VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDeviceRemovedCallback), strdup("device removed"), myFreeFunc); + callback16ret = virConnectNetworkEventRegisterAny(dconn, + NULL, + VIR_NETWORK_EVENT_ID_LIFECYCLE, + VIR_NETWORK_EVENT_CALLBACK(myNetworkEventCallback2), + strdup("callback 2"), myFreeFunc);
Again, s/callback 2/network callback/ or something. ACK once you do that. Michal

From: "Daniel P. Berrange" <berrange@redhat.com> While the public API & wire protocol included the 'detail' arg for network lifecycle events, the internal event handling code did not process it. This meant that if a future libvirtd server starts sending non-0 'detail' args, the current libvirt client will not process them. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/network_event.c | 7 +++++-- src/conf/network_event.h | 3 ++- src/network/bridge_driver.c | 15 ++++++++++----- src/remote/remote_driver.c | 2 +- src/test/test_driver.c | 15 ++++++++++----- 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/conf/network_event.c b/src/conf/network_event.c index 4a02523..b885ced 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -32,6 +32,7 @@ struct _virNetworkEventLifecycle { virObjectEvent parent; int type; + int detail; }; typedef struct _virNetworkEventLifecycle virNetworkEventLifecycle; typedef virNetworkEventLifecycle *virNetworkEventLifecyclePtr; @@ -80,7 +81,7 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn, networkLifecycleEvent = (virNetworkEventLifecyclePtr)event; ((virConnectNetworkEventLifecycleCallback)cb)(conn, net, networkLifecycleEvent->type, - 0, + networkLifecycleEvent->detail, cbopaque); goto cleanup; } @@ -135,7 +136,8 @@ virNetworkEventStateRegisterID(virConnectPtr conn, virObjectEventPtr virNetworkEventLifecycleNew(const char *name, const unsigned char *uuid, - int type) + int type, + int detail) { virNetworkEventLifecyclePtr event; int eventId = (VIR_EVENT_NAMESPACE_NETWORK << 8) + VIR_NETWORK_EVENT_ID_LIFECYCLE; @@ -149,6 +151,7 @@ virNetworkEventLifecycleNew(const char *name, return NULL; event->type = type; + event->detail = detail; return (virObjectEventPtr)event; } diff --git a/src/conf/network_event.h b/src/conf/network_event.h index 44b762e..1eef771 100644 --- a/src/conf/network_event.h +++ b/src/conf/network_event.h @@ -40,7 +40,8 @@ virNetworkEventStateRegisterID(virConnectPtr conn, virObjectEventPtr virNetworkEventLifecycleNew(const char *name, const unsigned char *uuid, - int type); + int type, + int detail); void virNetworkEventDispatchDefaultFunc(virConnectPtr conn, diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 1bde7d7..3e10758 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2559,7 +2559,8 @@ static virNetworkPtr networkCreateXML(virConnectPtr conn, const char *xml) { event = virNetworkEventLifecycleNew(network->def->name, network->def->uuid, - VIR_NETWORK_EVENT_STARTED); + VIR_NETWORK_EVENT_STARTED, + 0); VIR_INFO("Creating network '%s'", network->def->name); ret = virGetNetwork(conn, network->def->name, network->def->uuid); @@ -2621,7 +2622,8 @@ static virNetworkPtr networkDefineXML(virConnectPtr conn, const char *xml) { } event = virNetworkEventLifecycleNew(def->name, def->uuid, - VIR_NETWORK_EVENT_DEFINED); + VIR_NETWORK_EVENT_DEFINED, + 0); VIR_INFO("Defining network '%s'", def->name); ret = virGetNetwork(conn, def->name, def->uuid); @@ -2673,7 +2675,8 @@ networkUndefine(virNetworkPtr net) { event = virNetworkEventLifecycleNew(network->def->name, network->def->uuid, - VIR_NETWORK_EVENT_UNDEFINED); + VIR_NETWORK_EVENT_UNDEFINED, + 0); VIR_INFO("Undefining network '%s'", network->def->name); if (!active) { @@ -2890,7 +2893,8 @@ static int networkCreate(virNetworkPtr net) { event = virNetworkEventLifecycleNew(network->def->name, network->def->uuid, - VIR_NETWORK_EVENT_STARTED); + VIR_NETWORK_EVENT_STARTED, + 0); cleanup: if (event) @@ -2930,7 +2934,8 @@ static int networkDestroy(virNetworkPtr net) { event = virNetworkEventLifecycleNew(network->def->name, network->def->uuid, - VIR_NETWORK_EVENT_STOPPED); + VIR_NETWORK_EVENT_STOPPED, + 0); if (!network->persistent) { if (networkRemoveInactive(driver, network) < 0) { diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 7bd4b24..be282d6 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -4918,7 +4918,7 @@ remoteNetworkBuildEventLifecycle(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, if (!net) return; - event = virNetworkEventLifecycleNew(net->name, net->uuid, msg->event); + event = virNetworkEventLifecycleNew(net->name, net->uuid, msg->event, msg->detail); virNetworkFree(net); remoteDomainEventQueue(priv, event); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 30d2636..a48404a 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3542,7 +3542,8 @@ static virNetworkPtr testNetworkCreateXML(virConnectPtr conn, const char *xml) { net->active = 1; event = virNetworkEventLifecycleNew(net->def->name, net->def->uuid, - VIR_NETWORK_EVENT_STARTED); + VIR_NETWORK_EVENT_STARTED, + 0); ret = virGetNetwork(conn, net->def->name, net->def->uuid); @@ -3575,7 +3576,8 @@ virNetworkPtr testNetworkDefineXML(virConnectPtr conn, const char *xml) net->persistent = 1; event = virNetworkEventLifecycleNew(net->def->name, net->def->uuid, - VIR_NETWORK_EVENT_DEFINED); + VIR_NETWORK_EVENT_DEFINED, + 0); ret = virGetNetwork(conn, net->def->name, net->def->uuid); @@ -3611,7 +3613,8 @@ static int testNetworkUndefine(virNetworkPtr network) { } event = virNetworkEventLifecycleNew(network->name, network->uuid, - VIR_NETWORK_EVENT_UNDEFINED); + VIR_NETWORK_EVENT_UNDEFINED, + 0); virNetworkRemoveInactive(&privconn->networks, privnet); @@ -3699,7 +3702,8 @@ static int testNetworkCreate(virNetworkPtr network) { privnet->active = 1; event = virNetworkEventLifecycleNew(privnet->def->name, privnet->def->uuid, - VIR_NETWORK_EVENT_STARTED); + VIR_NETWORK_EVENT_STARTED, + 0); ret = 0; cleanup: @@ -3727,7 +3731,8 @@ static int testNetworkDestroy(virNetworkPtr network) { privnet->active = 0; event = virNetworkEventLifecycleNew(privnet->def->name, privnet->def->uuid, - VIR_NETWORK_EVENT_STOPPED); + VIR_NETWORK_EVENT_STOPPED, + 0); if (!privnet->persistent) { virNetworkRemoveInactive(&privconn->networks, privnet); -- 1.8.3.1

On Thu, Dec 12, 2013 at 06:04:03PM +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
While the public API & wire protocol included the 'detail' arg for network lifecycle events, the internal event handling code did not process it. This meant that if a future libvirtd server starts sending non-0 'detail' args, the current libvirt client will not process them.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/network_event.c | 7 +++++-- src/conf/network_event.h | 3 ++- src/network/bridge_driver.c | 15 ++++++++++----- src/remote/remote_driver.c | 2 +- src/test/test_driver.c | 15 ++++++++++----- 5 files changed, 28 insertions(+), 14 deletions(-)
ACK, Martin

On Thu, 2013-12-12 at 18:04 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
While the public API & wire protocol included the 'detail' arg for network lifecycle events, the internal event handling code did not process it. This meant that if a future libvirtd server starts sending non-0 'detail' args, the current libvirt client will not process them.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/network_event.c | 7 +++++-- src/conf/network_event.h | 3 ++- src/network/bridge_driver.c | 15 ++++++++++----- src/remote/remote_driver.c | 2 +- src/test/test_driver.c | 15 ++++++++++----- 5 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/src/conf/network_event.c b/src/conf/network_event.c index 4a02523..b885ced 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -32,6 +32,7 @@ struct _virNetworkEventLifecycle { virObjectEvent parent;
int type; + int detail; }; typedef struct _virNetworkEventLifecycle virNetworkEventLifecycle; typedef virNetworkEventLifecycle *virNetworkEventLifecyclePtr; @@ -80,7 +81,7 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn, networkLifecycleEvent = (virNetworkEventLifecyclePtr)event; ((virConnectNetworkEventLifecycleCallback)cb)(conn, net, networkLifecycleEvent->type, - 0, + networkLifecycleEvent->detail, cbopaque); goto cleanup; } @@ -135,7 +136,8 @@ virNetworkEventStateRegisterID(virConnectPtr conn, virObjectEventPtr virNetworkEventLifecycleNew(const char *name, const unsigned char *uuid, - int type) + int type, + int detail) { virNetworkEventLifecyclePtr event; int eventId = (VIR_EVENT_NAMESPACE_NETWORK << 8) + VIR_NETWORK_EVENT_ID_LIFECYCLE; @@ -149,6 +151,7 @@ virNetworkEventLifecycleNew(const char *name, return NULL;
event->type = type; + event->detail = detail;
return (virObjectEventPtr)event; } diff --git a/src/conf/network_event.h b/src/conf/network_event.h index 44b762e..1eef771 100644 --- a/src/conf/network_event.h +++ b/src/conf/network_event.h @@ -40,7 +40,8 @@ virNetworkEventStateRegisterID(virConnectPtr conn, virObjectEventPtr virNetworkEventLifecycleNew(const char *name, const unsigned char *uuid, - int type); + int type, + int detail);
void virNetworkEventDispatchDefaultFunc(virConnectPtr conn, diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 1bde7d7..3e10758 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2559,7 +2559,8 @@ static virNetworkPtr networkCreateXML(virConnectPtr conn, const char *xml) {
event = virNetworkEventLifecycleNew(network->def->name, network->def->uuid, - VIR_NETWORK_EVENT_STARTED); + VIR_NETWORK_EVENT_STARTED, + 0);
VIR_INFO("Creating network '%s'", network->def->name); ret = virGetNetwork(conn, network->def->name, network->def->uuid); @@ -2621,7 +2622,8 @@ static virNetworkPtr networkDefineXML(virConnectPtr conn, const char *xml) { }
event = virNetworkEventLifecycleNew(def->name, def->uuid, - VIR_NETWORK_EVENT_DEFINED); + VIR_NETWORK_EVENT_DEFINED, + 0);
VIR_INFO("Defining network '%s'", def->name); ret = virGetNetwork(conn, def->name, def->uuid); @@ -2673,7 +2675,8 @@ networkUndefine(virNetworkPtr net) {
event = virNetworkEventLifecycleNew(network->def->name, network->def->uuid, - VIR_NETWORK_EVENT_UNDEFINED); + VIR_NETWORK_EVENT_UNDEFINED, + 0);
VIR_INFO("Undefining network '%s'", network->def->name); if (!active) { @@ -2890,7 +2893,8 @@ static int networkCreate(virNetworkPtr net) {
event = virNetworkEventLifecycleNew(network->def->name, network->def->uuid, - VIR_NETWORK_EVENT_STARTED); + VIR_NETWORK_EVENT_STARTED, + 0);
cleanup: if (event) @@ -2930,7 +2934,8 @@ static int networkDestroy(virNetworkPtr net) {
event = virNetworkEventLifecycleNew(network->def->name, network->def->uuid, - VIR_NETWORK_EVENT_STOPPED); + VIR_NETWORK_EVENT_STOPPED, + 0);
if (!network->persistent) { if (networkRemoveInactive(driver, network) < 0) { diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 7bd4b24..be282d6 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -4918,7 +4918,7 @@ remoteNetworkBuildEventLifecycle(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, if (!net) return;
- event = virNetworkEventLifecycleNew(net->name, net->uuid, msg->event); + event = virNetworkEventLifecycleNew(net->name, net->uuid, msg->event, msg->detail); virNetworkFree(net);
remoteDomainEventQueue(priv, event); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 30d2636..a48404a 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3542,7 +3542,8 @@ static virNetworkPtr testNetworkCreateXML(virConnectPtr conn, const char *xml) { net->active = 1;
event = virNetworkEventLifecycleNew(net->def->name, net->def->uuid, - VIR_NETWORK_EVENT_STARTED); + VIR_NETWORK_EVENT_STARTED, + 0);
ret = virGetNetwork(conn, net->def->name, net->def->uuid);
@@ -3575,7 +3576,8 @@ virNetworkPtr testNetworkDefineXML(virConnectPtr conn, const char *xml) net->persistent = 1;
event = virNetworkEventLifecycleNew(net->def->name, net->def->uuid, - VIR_NETWORK_EVENT_DEFINED); + VIR_NETWORK_EVENT_DEFINED, + 0);
ret = virGetNetwork(conn, net->def->name, net->def->uuid);
@@ -3611,7 +3613,8 @@ static int testNetworkUndefine(virNetworkPtr network) { }
event = virNetworkEventLifecycleNew(network->name, network->uuid, - VIR_NETWORK_EVENT_UNDEFINED); + VIR_NETWORK_EVENT_UNDEFINED, + 0);
virNetworkRemoveInactive(&privconn->networks, privnet); @@ -3699,7 +3702,8 @@ static int testNetworkCreate(virNetworkPtr network) {
privnet->active = 1; event = virNetworkEventLifecycleNew(privnet->def->name, privnet->def->uuid, - VIR_NETWORK_EVENT_STARTED); + VIR_NETWORK_EVENT_STARTED, + 0); ret = 0;
cleanup: @@ -3727,7 +3731,8 @@ static int testNetworkDestroy(virNetworkPtr network) {
privnet->active = 0; event = virNetworkEventLifecycleNew(privnet->def->name, privnet->def->uuid, - VIR_NETWORK_EVENT_STOPPED); + VIR_NETWORK_EVENT_STOPPED, + 0); if (!privnet->persistent) { virNetworkRemoveInactive(&privconn->networks, privnet);
ACK -- Cedric

From: "Daniel P. Berrange" <berrange@redhat.com> Inject a virNetworkEvent class between virObjectEvent and virNetworkEventLifecycle to mirror virDomainEvent. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/network_event.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/conf/network_event.c b/src/conf/network_event.c index b885ced..b1312b7 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -28,23 +28,40 @@ #include "datatypes.h" #include "virlog.h" -struct _virNetworkEventLifecycle { +struct _virNetworkEvent { virObjectEvent parent; + /* Unused attribute to get virNetworkEvent class being created */ + bool dummy; +}; +typedef struct _virNetworkEvent virNetworkEvent; +typedef virNetworkEvent *virNetworkEventPtr; + +struct _virNetworkEventLifecycle { + virNetworkEvent parent; + int type; int detail; }; typedef struct _virNetworkEventLifecycle virNetworkEventLifecycle; typedef virNetworkEventLifecycle *virNetworkEventLifecyclePtr; +static virClassPtr virNetworkEventClass; static virClassPtr virNetworkEventLifecycleClass; +static void virNetworkEventDispose(void *obj); static void virNetworkEventLifecycleDispose(void *obj); static int virNetworkEventsOnceInit(void) { - if (!(virNetworkEventLifecycleClass = + if (!(virNetworkEventClass = virClassNew(virClassForObjectEvent(), + "virNetworkEvent", + sizeof(virNetworkEvent), + virNetworkEventDispose))) + return -1; + if (!(virNetworkEventLifecycleClass = + virClassNew(virNetworkEventClass, "virNetworkEventLifecycle", sizeof(virNetworkEventLifecycle), virNetworkEventLifecycleDispose))) @@ -55,6 +72,14 @@ virNetworkEventsOnceInit(void) VIR_ONCE_GLOBAL_INIT(virNetworkEvents) void +virNetworkEventDispose(void *obj) +{ + virNetworkEventPtr event = obj; + VIR_DEBUG("obj=%p", event); +} + + +void virNetworkEventLifecycleDispose(void *obj) { virNetworkEventLifecyclePtr event = obj; -- 1.8.3.1

On Thu, Dec 12, 2013 at 06:04:04PM +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Inject a virNetworkEvent class between virObjectEvent and virNetworkEventLifecycle to mirror virDomainEvent.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/network_event.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)
ACK, Martin

On Thu, 2013-12-12 at 18:04 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Inject a virNetworkEvent class between virObjectEvent and virNetworkEventLifecycle to mirror virDomainEvent.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/network_event.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/src/conf/network_event.c b/src/conf/network_event.c index b885ced..b1312b7 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -28,23 +28,40 @@ #include "datatypes.h" #include "virlog.h"
-struct _virNetworkEventLifecycle { +struct _virNetworkEvent { virObjectEvent parent;
+ /* Unused attribute to get virNetworkEvent class being created */ + bool dummy; +}; +typedef struct _virNetworkEvent virNetworkEvent; +typedef virNetworkEvent *virNetworkEventPtr; + +struct _virNetworkEventLifecycle { + virNetworkEvent parent; + int type; int detail; }; typedef struct _virNetworkEventLifecycle virNetworkEventLifecycle; typedef virNetworkEventLifecycle *virNetworkEventLifecyclePtr;
+static virClassPtr virNetworkEventClass; static virClassPtr virNetworkEventLifecycleClass; +static void virNetworkEventDispose(void *obj); static void virNetworkEventLifecycleDispose(void *obj);
static int virNetworkEventsOnceInit(void) { - if (!(virNetworkEventLifecycleClass = + if (!(virNetworkEventClass = virClassNew(virClassForObjectEvent(), + "virNetworkEvent", + sizeof(virNetworkEvent), + virNetworkEventDispose))) + return -1; + if (!(virNetworkEventLifecycleClass = + virClassNew(virNetworkEventClass, "virNetworkEventLifecycle", sizeof(virNetworkEventLifecycle), virNetworkEventLifecycleDispose))) @@ -55,6 +72,14 @@ virNetworkEventsOnceInit(void) VIR_ONCE_GLOBAL_INIT(virNetworkEvents)
void +virNetworkEventDispose(void *obj) +{ + virNetworkEventPtr event = obj; + VIR_DEBUG("obj=%p", event); +} + + +void virNetworkEventLifecycleDispose(void *obj) { virNetworkEventLifecyclePtr event = obj;
ACK -- Cedric

From: "Daniel P. Berrange" <berrange@redhat.com> Instead of having the object event code have to know about each type of event and their dispatch functions, associate a dispatch function with the object instance. The dispatch code can thus be significantly simplified. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/domain_event.c | 16 ++++++--- src/conf/domain_event.h | 7 ---- src/conf/network_event.c | 8 ++--- src/conf/network_event.h | 6 ---- src/conf/object_event.c | 72 +++++++++++------------------------------ src/conf/object_event_private.h | 9 +++++- 6 files changed, 42 insertions(+), 76 deletions(-) diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 64035f7..a9c499e 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -61,6 +61,11 @@ static void virDomainEventTrayChangeDispose(void *obj); static void virDomainEventBalloonChangeDispose(void *obj); static void virDomainEventDeviceRemovedDispose(void *obj); +static void +virDomainEventDispatchDefaultFunc(virConnectPtr conn, + virObjectEventPtr event, + virConnectObjectEventGenericCallback cb, + void *cbopaque); struct _virDomainEvent { virObjectEvent parent; @@ -462,7 +467,9 @@ virDomainEventNew(virClassPtr klass, return NULL; } - if (!(event = virObjectEventNew(klass, eventID, + if (!(event = virObjectEventNew(klass, + virDomainEventDispatchDefaultFunc, + eventID, id, name, uuid))) return NULL; @@ -1160,12 +1167,11 @@ virDomainEventDeviceRemovedNewFromDom(virDomainPtr dom, } -void +static void virDomainEventDispatchDefaultFunc(virConnectPtr conn, virObjectEventPtr event, - virConnectDomainEventGenericCallback cb, - void *cbopaque, - void *opaque ATTRIBUTE_UNUSED) + virConnectObjectEventGenericCallback cb, + void *cbopaque) { virDomainPtr dom = virGetDomain(conn, event->meta.name, event->meta.uuid); int eventID = virObjectEventGetEventID(event); diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h index 30156ed..b2ea580 100644 --- a/src/conf/domain_event.h +++ b/src/conf/domain_event.h @@ -197,11 +197,4 @@ virDomainEventStateDeregister(virConnectPtr conn, virConnectDomainEventCallback callback) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); -void -virDomainEventDispatchDefaultFunc(virConnectPtr conn, - virObjectEventPtr event, - virConnectDomainEventGenericCallback cb, - void *cbopaque, - void *opaque); - #endif diff --git a/src/conf/network_event.c b/src/conf/network_event.c index b1312b7..3173e68 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -87,12 +87,11 @@ virNetworkEventLifecycleDispose(void *obj) } -void +static void virNetworkEventDispatchDefaultFunc(virConnectPtr conn, virObjectEventPtr event, - virConnectNetworkEventGenericCallback cb ATTRIBUTE_UNUSED, - void *cbopaque ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + virConnectObjectEventGenericCallback cb, + void *cbopaque) { virNetworkPtr net = virGetNetwork(conn, event->meta.name, event->meta.uuid); if (!net) @@ -171,6 +170,7 @@ virNetworkEventLifecycleNew(const char *name, return NULL; if (!(event = virObjectEventNew(virNetworkEventLifecycleClass, + virNetworkEventDispatchDefaultFunc, eventId, 0, name, uuid))) return NULL; diff --git a/src/conf/network_event.h b/src/conf/network_event.h index 1eef771..a1afbc5 100644 --- a/src/conf/network_event.h +++ b/src/conf/network_event.h @@ -43,10 +43,4 @@ virNetworkEventLifecycleNew(const char *name, int type, int detail); -void -virNetworkEventDispatchDefaultFunc(virConnectPtr conn, - virObjectEventPtr event, - virConnectNetworkEventGenericCallback cb, - void *cbopaque, - void *opaque); #endif diff --git a/src/conf/object_event.c b/src/conf/object_event.c index ec00aaf..96c719c 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -466,6 +466,7 @@ error: void * virObjectEventNew(virClassPtr klass, + virObjectEventDispatchFunc dispatcher, int eventID, int id, const char *name, @@ -486,6 +487,7 @@ virObjectEventNew(virClassPtr klass, if (!(event = virObjectNew(klass))) return NULL; + event->dispatch = dispatcher; event->eventID = eventID; if (VIR_STRDUP(event->meta.name, name) < 0) { @@ -527,13 +529,6 @@ virObjectEventQueuePush(virObjectEventQueuePtr evtQueue, } -typedef void (*virObjectEventDispatchFunc)(virConnectPtr conn, - virObjectEventPtr event, - virConnectObjectEventGenericCallback cb, - void *cbopaque, - void *opaque); - - static int virObjectEventDispatchMatchCallback(virObjectEventPtr event, virObjectEventCallbackPtr cb) @@ -563,10 +558,9 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event, static void -virObjectEventDispatch(virObjectEventPtr event, - virObjectEventCallbackListPtr callbacks, - virObjectEventDispatchFunc dispatch, - void *opaque) +virObjectEventStateDispatchCallbacks(virObjectEventStatePtr state, + virObjectEventPtr event, + virObjectEventCallbackListPtr callbacks) { size_t i; /* Cache this now, since we may be dropping the lock, @@ -578,25 +572,26 @@ virObjectEventDispatch(virObjectEventPtr event, if (!virObjectEventDispatchMatchCallback(event, callbacks->callbacks[i])) continue; - (*dispatch)(callbacks->callbacks[i]->conn, - event, - callbacks->callbacks[i]->cb, - callbacks->callbacks[i]->opaque, - opaque); + /* Drop the lock whle dispatching, for sake of re-entrancy */ + virObjectEventStateUnlock(state); + event->dispatch(callbacks->callbacks[i]->conn, + event, + callbacks->callbacks[i]->cb, + callbacks->callbacks[i]->opaque); + virObjectEventStateLock(state); } } static void -virObjectEventQueueDispatch(virObjectEventQueuePtr queue, - virObjectEventCallbackListPtr callbacks, - virObjectEventDispatchFunc dispatch, - void *opaque) +virObjectEventStateQueueDispatch(virObjectEventStatePtr state, + virObjectEventQueuePtr queue, + virObjectEventCallbackListPtr callbacks) { size_t i; for (i = 0; i < queue->count; i++) { - virObjectEventDispatch(queue->events[i], callbacks, dispatch, opaque); + virObjectEventStateDispatchCallbacks(state, queue->events[i], callbacks); virObjectUnref(queue->events[i]); } VIR_FREE(queue->events); @@ -626,34 +621,6 @@ virObjectEventStateQueue(virObjectEventStatePtr state, static void -virObjectEventStateDispatchFunc(virConnectPtr conn, - virObjectEventPtr event, - virConnectObjectEventGenericCallback cb, - void *cbopaque, - void *opaque) -{ - virObjectEventStatePtr state = opaque; - virEventNamespaceID namespace = (event->eventID & 0xFF00) >> 8; - - /* Drop the lock whle dispatching, for sake of re-entrancy */ - virObjectEventStateUnlock(state); - switch (namespace) { - case VIR_EVENT_NAMESPACE_DOMAIN: - virDomainEventDispatchDefaultFunc(conn, event, - VIR_DOMAIN_EVENT_CALLBACK(cb), cbopaque, NULL); - break; - case VIR_EVENT_NAMESPACE_NETWORK: - virNetworkEventDispatchDefaultFunc(conn, event, - VIR_NETWORK_EVENT_CALLBACK(cb), cbopaque, NULL); - break; - default: - VIR_ERROR(_("Unknown event namespace to dispatch")); - } - virObjectEventStateLock(state); -} - - -static void virObjectEventStateFlush(virObjectEventStatePtr state) { virObjectEventQueue tempQueue; @@ -669,10 +636,9 @@ virObjectEventStateFlush(virObjectEventStatePtr state) state->queue->events = NULL; virEventUpdateTimeout(state->timer, -1); - virObjectEventQueueDispatch(&tempQueue, - state->callbacks, - virObjectEventStateDispatchFunc, - state); + virObjectEventStateQueueDispatch(state, + &tempQueue, + state->callbacks); /* Purge any deleted callbacks */ virObjectEventCallbackListPurgeMarked(state->callbacks); diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h index f41f432..f18277a 100644 --- a/src/conf/object_event_private.h +++ b/src/conf/object_event_private.h @@ -69,10 +69,17 @@ struct _virObjectEventCallback { int deleted; }; +typedef void +(*virObjectEventDispatchFunc)(virConnectPtr conn, + virObjectEventPtr event, + virConnectObjectEventGenericCallback cb, + void *cbopaque); + struct _virObjectEvent { virObject parent; int eventID; virObjectMeta meta; + virObjectEventDispatchFunc dispatch; }; virClassPtr @@ -108,10 +115,10 @@ virObjectEventTimer(int timer, void * virObjectEventNew(virClassPtr klass, + virObjectEventDispatchFunc dispatcher, int eventID, int id, const char *name, const unsigned char *uuid); - #endif -- 1.8.3.1

On Thu, Dec 12, 2013 at 06:04:05PM +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Instead of having the object event code have to know about each type of event and their dispatch functions, associate a dispatch function with the object instance. The dispatch code can thus be significantly simplified.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/domain_event.c | 16 ++++++--- src/conf/domain_event.h | 7 ---- src/conf/network_event.c | 8 ++--- src/conf/network_event.h | 6 ---- src/conf/object_event.c | 72 +++++++++++------------------------------ src/conf/object_event_private.h | 9 +++++- 6 files changed, 42 insertions(+), 76 deletions(-)
ACK, Martin

On Thu, 2013-12-12 at 18:04 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Instead of having the object event code have to know about each type of event and their dispatch functions, associate a dispatch function with the object instance. The dispatch code can thus be significantly simplified.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/domain_event.c | 16 ++++++--- src/conf/domain_event.h | 7 ---- src/conf/network_event.c | 8 ++--- src/conf/network_event.h | 6 ---- src/conf/object_event.c | 72 +++++++++++------------------------------ src/conf/object_event_private.h | 9 +++++- 6 files changed, 42 insertions(+), 76 deletions(-)
diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 64035f7..a9c499e 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -61,6 +61,11 @@ static void virDomainEventTrayChangeDispose(void *obj); static void virDomainEventBalloonChangeDispose(void *obj); static void virDomainEventDeviceRemovedDispose(void *obj);
+static void +virDomainEventDispatchDefaultFunc(virConnectPtr conn, + virObjectEventPtr event, + virConnectObjectEventGenericCallback cb, + void *cbopaque);
struct _virDomainEvent { virObjectEvent parent; @@ -462,7 +467,9 @@ virDomainEventNew(virClassPtr klass, return NULL; }
- if (!(event = virObjectEventNew(klass, eventID, + if (!(event = virObjectEventNew(klass, + virDomainEventDispatchDefaultFunc, + eventID, id, name, uuid))) return NULL;
@@ -1160,12 +1167,11 @@ virDomainEventDeviceRemovedNewFromDom(virDomainPtr dom, }
-void +static void virDomainEventDispatchDefaultFunc(virConnectPtr conn, virObjectEventPtr event, - virConnectDomainEventGenericCallback cb, - void *cbopaque, - void *opaque ATTRIBUTE_UNUSED) + virConnectObjectEventGenericCallback cb, + void *cbopaque) { virDomainPtr dom = virGetDomain(conn, event->meta.name, event->meta.uuid); int eventID = virObjectEventGetEventID(event); diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h index 30156ed..b2ea580 100644 --- a/src/conf/domain_event.h +++ b/src/conf/domain_event.h @@ -197,11 +197,4 @@ virDomainEventStateDeregister(virConnectPtr conn, virConnectDomainEventCallback callback) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
-void -virDomainEventDispatchDefaultFunc(virConnectPtr conn, - virObjectEventPtr event, - virConnectDomainEventGenericCallback cb, - void *cbopaque, - void *opaque); - #endif diff --git a/src/conf/network_event.c b/src/conf/network_event.c index b1312b7..3173e68 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -87,12 +87,11 @@ virNetworkEventLifecycleDispose(void *obj) }
-void +static void virNetworkEventDispatchDefaultFunc(virConnectPtr conn, virObjectEventPtr event, - virConnectNetworkEventGenericCallback cb ATTRIBUTE_UNUSED, - void *cbopaque ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + virConnectObjectEventGenericCallback cb, + void *cbopaque) { virNetworkPtr net = virGetNetwork(conn, event->meta.name, event->meta.uuid); if (!net) @@ -171,6 +170,7 @@ virNetworkEventLifecycleNew(const char *name, return NULL;
if (!(event = virObjectEventNew(virNetworkEventLifecycleClass, + virNetworkEventDispatchDefaultFunc, eventId, 0, name, uuid))) return NULL; diff --git a/src/conf/network_event.h b/src/conf/network_event.h index 1eef771..a1afbc5 100644 --- a/src/conf/network_event.h +++ b/src/conf/network_event.h @@ -43,10 +43,4 @@ virNetworkEventLifecycleNew(const char *name, int type, int detail);
-void -virNetworkEventDispatchDefaultFunc(virConnectPtr conn, - virObjectEventPtr event, - virConnectNetworkEventGenericCallback cb, - void *cbopaque, - void *opaque); #endif diff --git a/src/conf/object_event.c b/src/conf/object_event.c index ec00aaf..96c719c 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -466,6 +466,7 @@ error:
void * virObjectEventNew(virClassPtr klass, + virObjectEventDispatchFunc dispatcher, int eventID, int id, const char *name, @@ -486,6 +487,7 @@ virObjectEventNew(virClassPtr klass, if (!(event = virObjectNew(klass))) return NULL;
+ event->dispatch = dispatcher; event->eventID = eventID;
if (VIR_STRDUP(event->meta.name, name) < 0) { @@ -527,13 +529,6 @@ virObjectEventQueuePush(virObjectEventQueuePtr evtQueue, }
-typedef void (*virObjectEventDispatchFunc)(virConnectPtr conn, - virObjectEventPtr event, - virConnectObjectEventGenericCallback cb, - void *cbopaque, - void *opaque); - - static int virObjectEventDispatchMatchCallback(virObjectEventPtr event, virObjectEventCallbackPtr cb) @@ -563,10 +558,9 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event,
static void -virObjectEventDispatch(virObjectEventPtr event, - virObjectEventCallbackListPtr callbacks, - virObjectEventDispatchFunc dispatch, - void *opaque) +virObjectEventStateDispatchCallbacks(virObjectEventStatePtr state, + virObjectEventPtr event, + virObjectEventCallbackListPtr callbacks) { size_t i; /* Cache this now, since we may be dropping the lock, @@ -578,25 +572,26 @@ virObjectEventDispatch(virObjectEventPtr event, if (!virObjectEventDispatchMatchCallback(event, callbacks->callbacks[i])) continue;
- (*dispatch)(callbacks->callbacks[i]->conn, - event, - callbacks->callbacks[i]->cb, - callbacks->callbacks[i]->opaque, - opaque); + /* Drop the lock whle dispatching, for sake of re-entrancy */ + virObjectEventStateUnlock(state); + event->dispatch(callbacks->callbacks[i]->conn, + event, + callbacks->callbacks[i]->cb, + callbacks->callbacks[i]->opaque); + virObjectEventStateLock(state); } }
static void -virObjectEventQueueDispatch(virObjectEventQueuePtr queue, - virObjectEventCallbackListPtr callbacks, - virObjectEventDispatchFunc dispatch, - void *opaque) +virObjectEventStateQueueDispatch(virObjectEventStatePtr state, + virObjectEventQueuePtr queue, + virObjectEventCallbackListPtr callbacks) { size_t i;
for (i = 0; i < queue->count; i++) { - virObjectEventDispatch(queue->events[i], callbacks, dispatch, opaque); + virObjectEventStateDispatchCallbacks(state, queue->events[i], callbacks); virObjectUnref(queue->events[i]); } VIR_FREE(queue->events); @@ -626,34 +621,6 @@ virObjectEventStateQueue(virObjectEventStatePtr state,
static void -virObjectEventStateDispatchFunc(virConnectPtr conn, - virObjectEventPtr event, - virConnectObjectEventGenericCallback cb, - void *cbopaque, - void *opaque) -{ - virObjectEventStatePtr state = opaque; - virEventNamespaceID namespace = (event->eventID & 0xFF00) >> 8; - - /* Drop the lock whle dispatching, for sake of re-entrancy */ - virObjectEventStateUnlock(state); - switch (namespace) { - case VIR_EVENT_NAMESPACE_DOMAIN: - virDomainEventDispatchDefaultFunc(conn, event, - VIR_DOMAIN_EVENT_CALLBACK(cb), cbopaque, NULL); - break; - case VIR_EVENT_NAMESPACE_NETWORK: - virNetworkEventDispatchDefaultFunc(conn, event, - VIR_NETWORK_EVENT_CALLBACK(cb), cbopaque, NULL); - break; - default: - VIR_ERROR(_("Unknown event namespace to dispatch")); - } - virObjectEventStateLock(state); -} - - -static void virObjectEventStateFlush(virObjectEventStatePtr state) { virObjectEventQueue tempQueue; @@ -669,10 +636,9 @@ virObjectEventStateFlush(virObjectEventStatePtr state) state->queue->events = NULL; virEventUpdateTimeout(state->timer, -1);
- virObjectEventQueueDispatch(&tempQueue, - state->callbacks, - virObjectEventStateDispatchFunc, - state); + virObjectEventStateQueueDispatch(state, + &tempQueue, + state->callbacks);
/* Purge any deleted callbacks */ virObjectEventCallbackListPurgeMarked(state->callbacks); diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h index f41f432..f18277a 100644 --- a/src/conf/object_event_private.h +++ b/src/conf/object_event_private.h @@ -69,10 +69,17 @@ struct _virObjectEventCallback { int deleted; };
+typedef void +(*virObjectEventDispatchFunc)(virConnectPtr conn, + virObjectEventPtr event, + virConnectObjectEventGenericCallback cb, + void *cbopaque); + struct _virObjectEvent { virObject parent; int eventID; virObjectMeta meta; + virObjectEventDispatchFunc dispatch; };
virClassPtr @@ -108,10 +115,10 @@ virObjectEventTimer(int timer,
void * virObjectEventNew(virClassPtr klass, + virObjectEventDispatchFunc dispatcher, int eventID, int id, const char *name, const unsigned char *uuid);
- #endif
ACK. A clever way to get rid of the initialization problem. -- Cedric

From: "Daniel P. Berrange" <berrange@redhat.com> The event namespace concept is mostly redundant information. With the re-written dispatcher, the namespace is only used for equality comparisons between event IDs. This can be solved by just comparing virClassPtr instances instead. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/domain_event.c | 11 +++++++++-- src/conf/network_event.c | 15 +++++++++------ src/conf/object_event.c | 17 ++++++++++++----- src/conf/object_event.h | 11 +++-------- src/conf/object_event_private.h | 2 ++ 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index a9c499e..e5f5796 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -442,6 +442,7 @@ virDomainEventCallbackListAdd(virConnectPtr conn, virFreeCallback freecb) { return virObjectEventCallbackListAddID(conn, cbList, NULL, NULL, 0, + virDomainEventClass, VIR_DOMAIN_EVENT_ID_LIFECYCLE, VIR_OBJECT_EVENT_CALLBACK(callback), opaque, freecb, NULL); @@ -1372,6 +1373,9 @@ virDomainEventStateRegister(virConnectPtr conn, { int ret = -1; + if (virDomainEventsInitialize() < 0) + return -1; + virObjectEventStateLock(state); if ((state->callbacks->count == 0) && @@ -1426,14 +1430,17 @@ virDomainEventStateRegisterID(virConnectPtr conn, virFreeCallback freecb, int *callbackID) { + if (virDomainEventsInitialize() < 0) + return -1; + if (dom) return virObjectEventStateRegisterID(conn, state, dom->uuid, dom->name, - dom->id, eventID, + dom->id, virDomainEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), opaque, freecb, callbackID); else return virObjectEventStateRegisterID(conn, state, NULL, NULL, 0, - eventID, + virDomainEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), opaque, freecb, callbackID); } diff --git a/src/conf/network_event.c b/src/conf/network_event.c index 3173e68..3819702 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -97,7 +97,7 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn, if (!net) return; - switch ((virNetworkEventID) (event->eventID &0xFF)) { + switch ((virNetworkEventID)event->eventID) { case VIR_NETWORK_EVENT_ID_LIFECYCLE: { virNetworkEventLifecyclePtr networkLifecycleEvent; @@ -146,14 +146,18 @@ virNetworkEventStateRegisterID(virConnectPtr conn, virFreeCallback freecb, int *callbackID) { - int nsEventID = (VIR_EVENT_NAMESPACE_NETWORK << 8) + eventID; + if (virNetworkEventsInitialize() < 0) + return -1; + if (net) return virObjectEventStateRegisterID(conn, state, - net->uuid, net->name, 0, nsEventID, + net->uuid, net->name, 0, + virNetworkEventClass, eventID, cb, opaque, freecb, callbackID); else return virObjectEventStateRegisterID(conn, state, - NULL, NULL, 0, nsEventID, + NULL, NULL, 0, + virNetworkEventClass, eventID, cb, opaque, freecb, callbackID); } @@ -164,14 +168,13 @@ virNetworkEventLifecycleNew(const char *name, int detail) { virNetworkEventLifecyclePtr event; - int eventId = (VIR_EVENT_NAMESPACE_NETWORK << 8) + VIR_NETWORK_EVENT_ID_LIFECYCLE; if (virNetworkEventsInitialize() < 0) return NULL; if (!(event = virObjectEventNew(virNetworkEventLifecycleClass, virNetworkEventDispatchDefaultFunc, - eventId, + VIR_NETWORK_EVENT_ID_LIFECYCLE, 0, name, uuid))) return NULL; diff --git a/src/conf/object_event.c b/src/conf/object_event.c index 96c719c..aeee6d5 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -227,6 +227,7 @@ virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList) * @uuid: the uuid of the object to filter on * @name: the name of the object to filter on * @id: the ID of the object to filter on + * @klass: the base event class * @eventID: the event ID * @callback: the callback to add * @opaque: opaque data tio pass to callback @@ -240,6 +241,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, unsigned char uuid[VIR_UUID_BUFLEN], const char *name, int id, + virClassPtr klass, int eventID, virConnectObjectEventGenericCallback callback, void *opaque, @@ -258,6 +260,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, /* check if we already have this callback on our list */ for (i = 0; i < cbList->count; i++) { if (cbList->callbacks[i]->cb == VIR_OBJECT_EVENT_CALLBACK(callback) && + cbList->callbacks[i]->klass == klass && cbList->callbacks[i]->eventID == eventID && cbList->callbacks[i]->conn == conn && ((uuid && cbList->callbacks[i]->meta && @@ -274,6 +277,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, goto error; event->conn = conn; event->cb = callback; + event->klass = klass; event->eventID = eventID; event->opaque = opaque; event->freecb = freecb; @@ -299,7 +303,8 @@ virObjectEventCallbackListAddID(virConnectPtr conn, event->callbackID = cbList->nextID++; for (i = 0; i < cbList->count; i++) { - if (cbList->callbacks[i]->eventID == eventID && + if (cbList->callbacks[i]->klass == klass && + cbList->callbacks[i]->eventID == eventID && cbList->callbacks[i]->conn == conn && !cbList->callbacks[i]->deleted) ret++; @@ -537,6 +542,8 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event, return 0; if (cb->deleted) return 0; + if (!virObjectIsClass(event, cb->klass)) + return 0; if (cb->eventID != virObjectEventGetEventID(event)) return 0; @@ -652,6 +659,7 @@ virObjectEventStateFlush(virObjectEventStatePtr state) * virObjectEventStateRegisterID: * @conn: connection to associate with callback * @state: domain event state + * @klass: the base event class * @eventID: ID of the event type to register for * @cb: function to remove from event * @opaque: data blob to pass to callback @@ -669,6 +677,7 @@ virObjectEventStateRegisterID(virConnectPtr conn, unsigned char *uuid, const char *name, int id, + virClassPtr klass, int eventID, virConnectObjectEventGenericCallback cb, void *opaque, @@ -691,7 +700,8 @@ virObjectEventStateRegisterID(virConnectPtr conn, } ret = virObjectEventCallbackListAddID(conn, state->callbacks, - uuid, name, id, eventID, cb, opaque, freecb, + uuid, name, id, klass, eventID, + cb, opaque, freecb, callbackID); if (ret == -1 && @@ -766,9 +776,6 @@ virObjectEventStateEventID(virConnectPtr conn, virObjectEventStateLock(state); ret = virObjectEventCallbackListEventID(conn, state->callbacks, callbackID); - /* Callers don't need to know we are namespacing the event Ids */ - if (ret >= 0) - ret = (0xFF & ret); virObjectEventStateUnlock(state); return ret; } diff --git a/src/conf/object_event.h b/src/conf/object_event.h index 50cfe19..211defb 100644 --- a/src/conf/object_event.h +++ b/src/conf/object_event.h @@ -24,17 +24,11 @@ #include "internal.h" +#include "virobject.h" + #ifndef __OBJECT_EVENT_H__ # define __OBJECT_EVENT_H__ -/** Event IDs are computed in the following way: - virEventNamespaceID << 8 + vir*EventId - */ -typedef enum { - VIR_EVENT_NAMESPACE_DOMAIN = 0, /* 0 to keep value of virDomainEventId unchanged */ - VIR_EVENT_NAMESPACE_NETWORK = 1, -} virEventNamespaceID; - typedef struct _virObjectEventCallback virObjectEventCallback; typedef virObjectEventCallback *virObjectEventCallbackPtr; @@ -78,6 +72,7 @@ virObjectEventStateRegisterID(virConnectPtr conn, unsigned char *uuid, const char *name, int id, + virClassPtr klass, int eventID, virConnectObjectEventGenericCallback cb, void *opaque, diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h index f18277a..89c7675 100644 --- a/src/conf/object_event_private.h +++ b/src/conf/object_event_private.h @@ -60,6 +60,7 @@ struct _virObjectEventState { struct _virObjectEventCallback { int callbackID; + virClassPtr klass; int eventID; virConnectPtr conn; virObjectMetaPtr meta; @@ -94,6 +95,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, unsigned char *uuid, const char *name, int id, + virClassPtr klass, int eventID, virConnectObjectEventGenericCallback callback, void *opaque, -- 1.8.3.1

On Thu, Dec 12, 2013 at 06:04:06PM +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The event namespace concept is mostly redundant information. With the re-written dispatcher, the namespace is only used for equality comparisons between event IDs. This can be solved by just comparing virClassPtr instances instead.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/domain_event.c | 11 +++++++++-- src/conf/network_event.c | 15 +++++++++------ src/conf/object_event.c | 17 ++++++++++++----- src/conf/object_event.h | 11 +++-------- src/conf/object_event_private.h | 2 ++ 5 files changed, 35 insertions(+), 21 deletions(-)
Breaks the build, ACK with this squashed in: diff --git a/src/conf/object_event.h b/src/conf/object_event.h index 211defb..23ecb34 100644 --- a/src/conf/object_event.h +++ b/src/conf/object_event.h @@ -78,7 +78,7 @@ virObjectEventStateRegisterID(virConnectPtr conn, void *opaque, virFreeCallback freecb, int *callbackID) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(7); + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(8); int virObjectEventStateDeregisterID(virConnectPtr conn, virObjectEventStatePtr state, -- Martin

On 12.12.2013 19:04, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
The event namespace concept is mostly redundant information. With the re-written dispatcher, the namespace is only used for equality comparisons between event IDs. This can be solved by just comparing virClassPtr instances instead.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/domain_event.c | 11 +++++++++-- src/conf/network_event.c | 15 +++++++++------ src/conf/object_event.c | 17 ++++++++++++----- src/conf/object_event.h | 11 +++-------- src/conf/object_event_private.h | 2 ++ 5 files changed, 35 insertions(+), 21 deletions(-)
diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index a9c499e..e5f5796 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -442,6 +442,7 @@ virDomainEventCallbackListAdd(virConnectPtr conn, virFreeCallback freecb) { return virObjectEventCallbackListAddID(conn, cbList, NULL, NULL, 0, + virDomainEventClass, VIR_DOMAIN_EVENT_ID_LIFECYCLE, VIR_OBJECT_EVENT_CALLBACK(callback), opaque, freecb, NULL); @@ -1372,6 +1373,9 @@ virDomainEventStateRegister(virConnectPtr conn, { int ret = -1;
+ if (virDomainEventsInitialize() < 0) + return -1; + virObjectEventStateLock(state);
if ((state->callbacks->count == 0) && @@ -1426,14 +1430,17 @@ virDomainEventStateRegisterID(virConnectPtr conn, virFreeCallback freecb, int *callbackID) { + if (virDomainEventsInitialize() < 0) + return -1; + if (dom) return virObjectEventStateRegisterID(conn, state, dom->uuid, dom->name, - dom->id, eventID, + dom->id, virDomainEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), opaque, freecb, callbackID); else return virObjectEventStateRegisterID(conn, state, NULL, NULL, 0, - eventID, + virDomainEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), opaque, freecb, callbackID); } diff --git a/src/conf/network_event.c b/src/conf/network_event.c index 3173e68..3819702 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -97,7 +97,7 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn, if (!net) return;
- switch ((virNetworkEventID) (event->eventID &0xFF)) { + switch ((virNetworkEventID)event->eventID) { case VIR_NETWORK_EVENT_ID_LIFECYCLE: { virNetworkEventLifecyclePtr networkLifecycleEvent; @@ -146,14 +146,18 @@ virNetworkEventStateRegisterID(virConnectPtr conn, virFreeCallback freecb, int *callbackID) { - int nsEventID = (VIR_EVENT_NAMESPACE_NETWORK << 8) + eventID; + if (virNetworkEventsInitialize() < 0) + return -1; + if (net) return virObjectEventStateRegisterID(conn, state, - net->uuid, net->name, 0, nsEventID, + net->uuid, net->name, 0, + virNetworkEventClass, eventID, cb, opaque, freecb, callbackID); else return virObjectEventStateRegisterID(conn, state, - NULL, NULL, 0, nsEventID, + NULL, NULL, 0, + virNetworkEventClass, eventID, cb, opaque, freecb, callbackID); }
@@ -164,14 +168,13 @@ virNetworkEventLifecycleNew(const char *name, int detail) { virNetworkEventLifecyclePtr event; - int eventId = (VIR_EVENT_NAMESPACE_NETWORK << 8) + VIR_NETWORK_EVENT_ID_LIFECYCLE;
if (virNetworkEventsInitialize() < 0) return NULL;
if (!(event = virObjectEventNew(virNetworkEventLifecycleClass, virNetworkEventDispatchDefaultFunc, - eventId, + VIR_NETWORK_EVENT_ID_LIFECYCLE, 0, name, uuid))) return NULL;
diff --git a/src/conf/object_event.c b/src/conf/object_event.c index 96c719c..aeee6d5 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -227,6 +227,7 @@ virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList) * @uuid: the uuid of the object to filter on * @name: the name of the object to filter on * @id: the ID of the object to filter on + * @klass: the base event class * @eventID: the event ID * @callback: the callback to add * @opaque: opaque data tio pass to callback @@ -240,6 +241,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, unsigned char uuid[VIR_UUID_BUFLEN], const char *name, int id, + virClassPtr klass, int eventID, virConnectObjectEventGenericCallback callback, void *opaque, @@ -258,6 +260,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, /* check if we already have this callback on our list */ for (i = 0; i < cbList->count; i++) { if (cbList->callbacks[i]->cb == VIR_OBJECT_EVENT_CALLBACK(callback) && + cbList->callbacks[i]->klass == klass && cbList->callbacks[i]->eventID == eventID && cbList->callbacks[i]->conn == conn && ((uuid && cbList->callbacks[i]->meta && @@ -274,6 +277,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, goto error; event->conn = conn; event->cb = callback; + event->klass = klass; event->eventID = eventID; event->opaque = opaque; event->freecb = freecb; @@ -299,7 +303,8 @@ virObjectEventCallbackListAddID(virConnectPtr conn, event->callbackID = cbList->nextID++;
for (i = 0; i < cbList->count; i++) { - if (cbList->callbacks[i]->eventID == eventID && + if (cbList->callbacks[i]->klass == klass && + cbList->callbacks[i]->eventID == eventID && cbList->callbacks[i]->conn == conn && !cbList->callbacks[i]->deleted) ret++; @@ -537,6 +542,8 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event, return 0; if (cb->deleted) return 0; + if (!virObjectIsClass(event, cb->klass)) + return 0;
Yep. since cb->klass must be non-null at this point this won't crash anymore. ACK Michal

From: "Daniel P. Berrange" <berrange@redhat.com> Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/object_event.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/conf/object_event.c b/src/conf/object_event.c index aeee6d5..80b85bd 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -252,6 +252,11 @@ virObjectEventCallbackListAddID(virConnectPtr conn, size_t i; int ret = 0; + VIR_DEBUG("conn=%p cblist=%p uuid=%p name=%s id=%d " + "klass=%p eventID=%d callback=%p opaque=%p", + conn, cbList, uuid, name, id, klass, eventID, + callback, opaque); + /* Check incoming */ if (!cbList) { return -1; -- 1.8.3.1

On Thu, Dec 12, 2013 at 06:04:07PM +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/object_event.c | 5 +++++ 1 file changed, 5 insertions(+)
Trivial, ACK, Martin

On 12.12.2013 19:04, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/conf/object_event.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/src/conf/object_event.c b/src/conf/object_event.c index aeee6d5..80b85bd 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -252,6 +252,11 @@ virObjectEventCallbackListAddID(virConnectPtr conn, size_t i; int ret = 0;
+ VIR_DEBUG("conn=%p cblist=%p uuid=%p name=%s id=%d " + "klass=%p eventID=%d callback=%p opaque=%p", + conn, cbList, uuid, name, id, klass, eventID, + callback, opaque); + /* Check incoming */ if (!cbList) { return -1;
ACK Michal
participants (4)
-
Cedric Bosdonnat
-
Daniel P. Berrange
-
Martin Kletzander
-
Michal Privoznik