- 08 1月, 2014 2 次提交
-
-
由 Eric Blake 提交于
Tighten up scope after the previous patch avoided using internals. This will also make it easier to change internal implementation without having to chase down quite as many impacted callers or worrying about two files getting implementations out of sync. * src/conf/object_event_private.h (virObjectEventCallbackListAddID, virObjectEventQueueClear) (virObjectEventStateLock, virObjectEventStateUnlock) (virObjectEventTimer): Drop prototype. (_virObjectEventCallbackList, _virObjectEventState) (_virObjectEventCallback): Move... * src/conf/object_event.c: ...here. (virObjectEventCallbackListAddID, virObjectEventQueueClear) (virObjectEventStateLock, virObjectEventStateUnlock) (virObjectEventTimer): Mark private. Signed-off-by: NEric Blake <eblake@redhat.com>
-
由 Eric Blake 提交于
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. And like all good bug fix patches, I enhanced the testsuite, validating that the changes in tests/ expose the failure without the rest of the patch. * 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. * tests/objecteventtest.c (testDomainCreateXMLMixed): New test. Signed-off-by: NEric Blake <eblake@redhat.com>
-
- 06 1月, 2014 2 次提交
-
-
由 Eric Blake 提交于
We might as well take advantage of viralloc.h instead of open-coding array management ourselves. While at it, I simplified several places that were doing repetitive pointer chasing to use an intermediate variable for legibility (some other places remain, but they will disapper in later refactoring patches). * src/conf/object_event_private.h (_virObjectEventCallbackList): Use size_t for count. * src/conf/object_event.c (_virObjectEventQueue): Likewise. (virObjectEventCallbackListRemoveID): Use VIR_DELETE_ELEMENT. (virObjectEventQueuePush, virObjectEventCallbackListAddID): Use VIR_APPEND_ELEMENT. (virObjectEventCallbackListEventID) (virObjectEventStateDispatchCallbacks): Simplify code. Signed-off-by: NEric Blake <eblake@redhat.com>
-
由 Eric Blake 提交于
No need to use an int that only ever stores 0 and 1. * src/conf/object_event_private.h (_virObjectEventCallback): Change deleted to bool. * src/conf/object_event.c (virObjectEventDispatchMatchCallback): Switch return type to bool. (virObjectEventCallbackListMarkDeleteID): Update client. * src/conf/domain_event.c (virDomainEventCallbackListMarkDelete): Likewise.
-
- 04 1月, 2014 2 次提交
-
-
由 Eric Blake 提交于
Any file with access to object_event_private.h also has access to the internals of virObjectEvent, without needing an accessor function. Not to mention the accessor function was doing type checks that would always succeed. * src/conf/object_event_private.h (virObjectEventGetEventID): Drop. * src/conf/object_event.c (virObjectEventGetEventID): Drop. (virObjectEventDispatchMatchCallback): Simplify caller. * src/conf/domain_event.c (virDomainEventDispatchDefaultFunc): Likewise. Signed-off-by: NEric Blake <eblake@redhat.com>
-
由 Eric Blake 提交于
While working on events, I found a number of minor issues; I'm hoisting these to the front rather than doing it piecemeal in the patches where I first noticed bad or missing documentation. * src/conf/object_event.c: Fix grammar, document all parameters of public functions, wrap some long lines. * src/conf/object_event.h: Likewise. * src/conf/network_event.c: Likewise. * src/conf/domain_event.c: Likewise (except for the large number of event creation functions). * src/libvirt_private.cyms (conf/object_event.h): Split... (conf/network_event.h): ...to account for new file. Signed-off-by: NEric Blake <eblake@redhat.com>
-
- 14 12月, 2013 3 次提交
-
-
由 Daniel P. Berrange 提交于
Signed-off-by: NDaniel P. Berrange <berrange@redhat.com>
-
由 Daniel P. Berrange 提交于
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: NDaniel P. Berrange <berrange@redhat.com>
-
由 Daniel P. Berrange 提交于
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: NDaniel P. Berrange <berrange@redhat.com>
-
- 13 12月, 2013 1 次提交
-
-
由 Nehal J Wani 提交于
While running objecteventtest, it was found that valgrind pointed out the following memory leak: ==13464== 5 bytes in 1 blocks are definitely lost in loss record 7 of 134 ==13464== at 0x4A0887C: malloc (vg_replace_malloc.c:270) ==13464== by 0x341F485E21: strdup (strdup.c:42) ==13464== by 0x4CAE28F: virStrdup (virstring.c:554) ==13464== by 0x4CF3CBE: virObjectEventCallbackListAddID (object_event.c:286) ==13464== by 0x4CF49CA: virObjectEventStateRegisterID (object_event.c:729) ==13464== by 0x4CF73FE: virDomainEventStateRegisterID (domain_event.c:1424) ==13464== by 0x4D7358F: testConnectDomainEventRegisterAny (test_driver.c:6032) ==13464== by 0x4D600C8: virConnectDomainEventRegisterAny (libvirt.c:19128) ==13464== by 0x402409: testDomainStartStopEvent (objecteventtest.c:232) ==13464== by 0x403451: virtTestRun (testutils.c:138) ==13464== by 0x402012: mymain (objecteventtest.c:395) ==13464== by 0x403AF2: virtTestMain (testutils.c:593) ==13464==
-
- 11 12月, 2013 3 次提交
-
-
由 Cédric Bosdonnat 提交于
Hitting this should be pretty rare, but at least developers will know that they are providing a weird event ID. Otherwise for namespace that are added in the normal way, gcc will raise a warning about unhandled case in the switch.
-
由 Cédric Bosdonnat 提交于
-
由 Cédric Bosdonnat 提交于
Define the public API for (de-)registering network events and the callbacks for receiving lifecycle events. The lifecycle event includes a 'detail' parameter to match the domain lifecycle event data, but this is currently unused. The network events related code goes into its own set of internal files src/conf/network_event.[ch]
-
- 10 12月, 2013 1 次提交
-
-
由 Cédric Bosdonnat 提交于
-