There statstest test case is expected to raise a number of libvirt errors. Since these are now stored in thread locals, it is expected that this won't be free'd automatically at system shutdown. This patch adds a call to virResetError() at the end to release the memory associated with the stored error object. There is still one block of memory alocated though, which is the thread local error error object itself. We can't free this easily, so I just add a valgrind suppression rule instead. This lets 'make valgrind' pass again Also since the test case doesn't call virInitialize()as a normal app would do, we need to explicitly initialize the thread local storage to ensure things work correctly. Daniel diff -r 93337ec227d6 tests/.valgrind.supp --- a/tests/.valgrind.supp Mon Jan 26 15:25:53 2009 +0000 +++ b/tests/.valgrind.supp Tue Jan 27 11:15:47 2009 +0000 @@ -238,3 +238,18 @@ fun:virtTestRun fun:mymain } +{ + ignoreThreadLocalErrorObject + Memcheck:Leak + fun:calloc + fun:virAlloc + fun:virLastErrorObject + fun:virRaiseError + fun:statsErrorFunc + fun:xenLinuxDomainDeviceID + fun:testDeviceHelper + fun:virtTestRun + fun:mymain + fun:virtTestMain + fun:main +} diff -r 93337ec227d6 tests/testutils.c --- a/tests/testutils.c Mon Jan 26 15:25:53 2009 +0000 +++ b/tests/testutils.c Tue Jan 27 11:15:47 2009 +0000 @@ -26,6 +26,8 @@ #include "internal.h" #include "memory.h" #include "util.h" +#include "threads.h" +#include "virterror_internal.h" #if TEST_OOM_TRACE #include <execinfo.h> @@ -319,8 +321,8 @@ int virtTestMain(int argc, int (*func)(int, char **)) { char *debugStr; + int ret; #if TEST_OOM - int ret; int approxAlloc = 0; int n; char *oomStr = NULL; @@ -330,6 +332,10 @@ int virtTestMain(int argc, int worker = 0; #endif + if (virThreadInitialize() < 0 || + virErrorInitialize() < 0) + return 1; + if ((debugStr = getenv("VIR_TEST_DEBUG")) != NULL) { if (virStrToLong_ui(debugStr, NULL, 10, &testDebug) < 0) testDebug = 0; @@ -349,8 +355,10 @@ int virtTestMain(int argc, if (getenv("VIR_TEST_MP") != NULL) { mp = sysconf(_SC_NPROCESSORS_ONLN); fprintf(stderr, "Using %d worker processes\n", mp); - if (VIR_ALLOC_N(workers, mp) < 0) - return EXIT_FAILURE; + if (VIR_ALLOC_N(workers, mp) < 0) { + ret = EXIT_FAILURE; + goto cleanup; + } } if (testOOM) @@ -359,7 +367,7 @@ int virtTestMain(int argc, /* Run once to count allocs, and ensure it passes :-) */ ret = (func)(argc, argv); if (ret != EXIT_SUCCESS) - return EXIT_FAILURE; + goto cleanup; #if TEST_OOM_TRACE if (testDebug) @@ -431,9 +439,11 @@ int virtTestMain(int argc, else fprintf(stderr, " FAILED\n"); } +cleanup: +#else + ret = (func)(argc, argv); +#endif + + virResetLastError(); return ret; - -#else - return (func)(argc, argv); -#endif } -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list