• E
    event: make deregister return value match docs · 31b5bad9
    Eric Blake 提交于
    Ever since their introduction (commit 1509b802 in v0.5.0 for
    virConnectDomainEventRegister, commit 44457238 in v0.8.0 for
    virConnectDomainEventDeregisterAny), the event deregistration
    functions have been documented as returning 0 on success;
    likewise for older registration (only the newer RegisterAny
    must return a non-zero callbackID).  And now that we are
    adding virConnectNetworkEventDeregisterAny for v1.2.1, it
    should have the same semantics.
    
    Fortunately, all of the stateful drivers have been obeying
    the docs and returning 0, thanks to the way the remote_driver
    tracks things (in fact, the RPC wire protocol is unable to
    send a return value for DomainEventRegisterAny, at least not
    without adding a new RPC number).  Well, except for vbox,
    which was always failing deregistration, due to failure to
    set the return value to anything besides its initial -1.
    
    But for local drivers, such as test:///default, we've been
    returning non-zero numbers; worse, the non-zero numbers have
    differed over time.  For example, in Fedora 12 (libvirt 0.8.2),
    calling Register twice would return 0 and 1 [the callbackID
    generated under the hood]; while in Fedora 20 (libvirt 1.1.3),
    it returns 1 and 2 [the number of callbacks registered for
    that event type].  Since we have changed the behavior over
    time, and since it differs by local vs. remote, we can safely
    argue that no one could have been reasonably relying on any
    particular behavior, so we might as well obey the docs, as well
    as prepare callers that might deal with older clients to not be
    surprised if the docs are not strictly followed.
    
    For consistency, this patch fixes the code for all drivers,
    even though it only makes an impact for vbox and for local
    drivers.  By fixing all drivers, future copy and paste from
    a remote driver to a local driver is less likely to
    reintroduce the bug.
    
    Finally, update the testsuite to gain some coverage of the
    issue for local drivers, including the first test of old-style
    domain event registration via function pointer instead of
    event id.
    
    * src/libvirt.c (virConnectDomainEventRegister)
    (virConnectDomainEventDeregister)
    (virConnectDomainEventDeregisterAny): Clarify docs.
    * src/libxl/libxl_driver.c (libxlConnectDomainEventRegister)
    (libxlConnectDomainEventDeregister)
    (libxlConnectDomainEventDeregisterAny): Match documentation.
    * src/lxc/lxc_driver.c (lxcConnectDomainEventRegister)
    (lxcConnectDomainEventDeregister)
    (lxcConnectDomainEventDeregisterAny): Likewise.
    * src/test/test_driver.c (testConnectDomainEventRegister)
    (testConnectDomainEventDeregister)
    (testConnectDomainEventDeregisterAny)
    (testConnectNetworkEventDeregisterAny): Likewise.
    * src/uml/uml_driver.c (umlConnectDomainEventRegister)
    (umlConnectDomainEventDeregister)
    (umlConnectDomainEventDeregisterAny): Likewise.
    * src/vbox/vbox_tmpl.c (vboxConnectDomainEventRegister)
    (vboxConnectDomainEventDeregister)
    (vboxConnectDomainEventDeregisterAny): Likewise.
    * src/xen/xen_driver.c (xenUnifiedConnectDomainEventRegister)
    (xenUnifiedConnectDomainEventDeregister)
    (xenUnifiedConnectDomainEventDeregisterAny): Likewise.
    * src/network/bridge_driver.c
    (networkConnectNetworkEventDeregisterAny): Likewise.
    * tests/objecteventtest.c (testDomainCreateXMLOld): New test.
    (mymain): Run it.
    (testDomainCreateXML): Check return values.
    Signed-off-by: NEric Blake <eblake@redhat.com>
    31b5bad9
vbox_tmpl.c 342.5 KB