mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-29 00:55:22 +00:00
0cd02bca6e
Consider these two calls, in either order: id1 = virConnectDomainEventRegisterAny(conn, NULL, VIR_DOMAIN_EVENT_ID_LIFECYCLE, VIR_DOMAIN_EVENT_CALLBACK(callback), NULL, NULL); virConnectDomainEventRegister(conn, callback, NULL, NULL); Right now, the second call fails, because under the hood, the old-style function registration is tightly coupled to the new style lifecycle eventID, and the two calls both try to register the same global eventID callback representation. We've alreay documented that users should avoid old-style registration and deregistration, so anyone heeding the advice won't run into this situation. But it would be even nicer if we pretend the two interfaces are completely separate, and disallow any cross-linking. That is, a call to old-style deregister should never remove a new-style callback even if it is the same function pointer, and a call to new-style callback using only callbackIDs obtained legitimately should never remove an old-style callback (of course, since our callback IDs are sequential, and there is still coupling under the hood, you can easily guess the callbackID of an old style registration and use new-style deregistration to nuke it - but that starts to be blatantly bad coding on your part rather than a surprising result on what looks like reasonable stand-alone API). With this patch, you can now register a global lifecycle event handler twice, by using both old and new APIs; if such an event occurs, your callback will be entered twice. But that is not a problem in practice, since it is already possible to use the new API to register both a global and per-domain event handler using the same function, which will likewise fire your callback twice for that domain. Duplicates are still prevented when using the same API with same parameters twice (old-style twice, new-style global twice, or new-style per-domain with same domain twice), and things are still bounded (it is not possible to register a single function pointer more than N+2 times per event id, where N is the number of domains available on the connection). Besides, it has always been possible to register as many separate function pointers on the same event id as desired, through either old or new style API, where the bound there is the physical limitation of writing a program with enough distinct function pointers. Adding another event registration in the testsuite is sufficient to cover this, where the test fails without the rest of the patch. * src/conf/object_event.c (_virObjectEventCallback): Add field. (virObjectEventCallbackLookup): Add argument. (virObjectEventCallbackListAddID, virObjectEventStateCallbackID): Adjust callers. * tests/objecteventtest.c (testDomainCreateXMLMixed): Enhance test. Signed-off-by: Eric Blake <eblake@redhat.com> |
||
---|---|---|
.. | ||
capabilities.c | ||
capabilities.h | ||
cpu_conf.c | ||
cpu_conf.h | ||
device_conf.c | ||
device_conf.h | ||
domain_audit.c | ||
domain_audit.h | ||
domain_conf.c | ||
domain_conf.h | ||
domain_event.c | ||
domain_event.h | ||
domain_nwfilter.c | ||
domain_nwfilter.h | ||
interface_conf.c | ||
interface_conf.h | ||
netdev_bandwidth_conf.c | ||
netdev_bandwidth_conf.h | ||
netdev_vlan_conf.c | ||
netdev_vlan_conf.h | ||
netdev_vport_profile_conf.c | ||
netdev_vport_profile_conf.h | ||
network_conf.c | ||
network_conf.h | ||
network_event.c | ||
network_event.h | ||
node_device_conf.c | ||
node_device_conf.h | ||
nwfilter_conf.c | ||
nwfilter_conf.h | ||
nwfilter_ipaddrmap.c | ||
nwfilter_ipaddrmap.h | ||
nwfilter_params.c | ||
nwfilter_params.h | ||
object_event_private.h | ||
object_event.c | ||
object_event.h | ||
secret_conf.c | ||
secret_conf.h | ||
snapshot_conf.c | ||
snapshot_conf.h | ||
storage_conf.c | ||
storage_conf.h | ||
storage_encryption_conf.c | ||
storage_encryption_conf.h | ||
virchrdev.c | ||
virchrdev.h |