]> xenbits.xensource.com Git - libvirt.git/commitdiff
event-test: Unregister close callback
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 13 Dec 2013 16:07:52 +0000 (17:07 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 24 Dec 2013 16:18:34 +0000 (17:18 +0100)
When registering a close callback, the connection refcount is increased
as the connection object is passed to the callback and hence we must
prevent deleting it too soon. However, when closing the connection, the
connection object is just unrefed. So whenever a connection with a close
callback is closed, we end up with the connection object which has
exactly one reference. Leaving the code as-is doesn't mean the end of
the world as we know it, but why give a bad example?

==14531== 288 bytes in 1 blocks are still reachable in loss record 695 of 762
==14531==    at 0x4C2BDE4: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==14531==    by 0x4E9FE09: virAllocVar (viralloc.c:558)
==14531==    by 0x4EDBE45: virObjectNew (virobject.c:190)
==14531==    by 0x4F71AAC: virGetConnect (datatypes.c:116)
==14531==    by 0x4F78511: do_open (libvirt.c:1136)
==14531==    by 0x4F7B3AC: virConnectOpenAuth (libvirt.c:1481)
==14531==    by 0x4011D2: main (event-test.c:499)

(and other leaks tied to virGetConnect())

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
examples/object-events/event-test.c

index f872b9ff65008d2428cd942fe63f386f0115f10a..228a091bf86814c4eddc0b4bcf06ed502d14d407 100644 (file)
@@ -675,6 +675,8 @@ int main(int argc, char **argv)
             virConnectDomainEventDeregisterAny(dconn, callback8ret);
     }
 
+    virConnectUnregisterCloseCallback(dconn, connectClose);
+
     VIR_DEBUG("Closing connection");
     if (dconn && virConnectClose(dconn) < 0) {
         printf("error closing\n");