
On Wed, Jun 27, 2012 at 02:44:02PM +0200, Michal Privoznik wrote:
On 27.06.2012 14:36, Eric Blake wrote:
On 06/27/2012 06:12 AM, Michal Privoznik wrote:
virConnectDomainEventRegisterAny() takes a domain as an argument. So it should be possible to register the same event (be it VIR_DOMAIN_EVENT_ID_LIFECYCLE for example) for two different domains. That is, we need to take domain into account when searching for duplicate event being already registered. --- src/conf/domain_event.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 4ecc413..3cfd940 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -363,7 +363,11 @@ virDomainEventCallbackListAddID(virConnectPtr conn, for (i = 0 ; i < cbList->count ; i++) { if (cbList->callbacks[i]->cb == VIR_DOMAIN_EVENT_CALLBACK(callback) && cbList->callbacks[i]->eventID == eventID && - cbList->callbacks[i]->conn == conn) { + cbList->callbacks[i]->conn == conn && + ((dom && cbList->callbacks[i]->dom && + memcmp(cbList->callbacks[i]->dom->uuid, + dom->uuid, VIR_UUID_BUFLEN) == 0) || + (!dom && !cbList->callbacks[i]->dom))) {
This misses the case of registering a catchall against NULL domain then attempting to re-register the same event against a specific domain (which one of the two would fire?). It also misses the case of registering a domain-specific handler, then attempting to broaden things into a global handler.
Yes, but that's intentional. In both cases both events are fired.
I think the idea of double registration makes sense (in particular, if I have a per-domain callback, but then want to switch to global, I would rather have a window with both handlers at once than a window with no handler at all), but I have not tested whether we actually handle it by firing both the global and domain-specific callback.
I've tested it and it works.
How ? The remote driver does not ever pass the virDomainPtr arg over the wire, and it restricts itself to 1 single callback per event type. Only the client side drivers (test, esx, virtualbox) could possibly work, but not KVM, LXC, Xen, UML 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 :|