[libvirt] [PATCHv2 07/14] event: don't let old-style events clobber per-domain events
John Ferlan
jferlan at redhat.com
Tue Jan 7 15:14:39 UTC 2014
On 01/06/2014 05:27 PM, Eric Blake wrote:
> Right now, the older virConnectDomainEventRegister (takes a
> function pointer, returns 0 on success) and the newer
> virConnectDomainEventRegisterID (takes an eventID, returns a
> callbackID) share the underlying implementation (the older
> API ends up consuming a callbackID for eventID 0 under the
> hood). We implemented that by a lot of copy and pasted
> code between object_event.c and domain_event.c, according to
> whether we are dealing with a function pointer or an eventID.
> However, our copy and paste is not symmetric. Consider this
> sequence:
>
> id1 = virConnectDomainEventRegisterAny(conn, dom,
> VIR_DOMAIN_EVENT_ID_LIFECYCLE,
> VIR_DOMAIN_EVENT_CALLBACK(callback), NULL, NULL);
> virConnectDomainEventRegister(conn, callback, NULL, NULL);
> virConnectDomainEventDeregister(conn, callback);
> virConnectDomainEventDeregsiterAny(conn, id1);
>
> the first three calls would succeed, but the third call ended
> up nuking the id1 callbackID (the per-domain new-style handler),
> then the fourth call failed with an error about an unknown
> callbackID, leaving us with the global handler (old-style) still
> live and receiving events. It required another old-style
> deregister to clean up the mess. Root cause was that
> virDomainEventCallbackList{Remove,MarkDelete} were only
> checking for function pointer match, rather than also checking
> for whether the registration was global.
>
> Rather than playing with the guts of object_event ourselves
> in domain_event, it is nicer to add a mapping function for the
> internal callback id, then share common code for event removal.
> For now, the function-to-id mapping is used only internally;
> I thought about whether a new public API to let a user learn
> the callback would be useful, but decided exposing this to the
> user is probably a disservice, since we already publicly
> document that they should avoid the old style, and since this
> patch already demonstrates that older libvirt versions have
> weird behavior when mixing old and new styles.
>
> * src/conf/object_event.c (virObjectEventCallbackLookup)
> (virObjectEventStateCallbackID): New functions.
> (virObjectEventCallbackLookup): Use helper function.
> * src/conf/object_event_private.h (virObjectEventStateCallbackID):
> Declare new function.
> * src/conf/domain_event.c (virDomainEventStateRegister)
> (virDomainEventStateDeregister): Let common code handle the
> complexity.
> (virDomainEventCallbackListRemove)
> (virDomainEventCallbackListMarkDelete)
> (virDomainEventCallbackListAdd): Drop unused functions.
>
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
> src/conf/domain_event.c | 171 ++++------------------------------------
> src/conf/object_event.c | 96 +++++++++++++++++++---
> src/conf/object_event_private.h | 9 +++
> 3 files changed, 109 insertions(+), 167 deletions(-)
>
ACK the pair (6 & 7)... The intro comment to 6 had me do a double take
though thinking I messed up the pair!
John
More information about the libvir-list
mailing list