]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virThreadPoolFree: Join worker threads
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 13 Nov 2013 13:40:12 +0000 (14:40 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 4 Dec 2013 15:36:46 +0000 (16:36 +0100)
Even though currently we are freeing the pool of worker threads at the
daemon very end, nothing holds us back in joining the worker threads.
Moreover, we avoid leaks like this:

==26697== 1,680 bytes in 5 blocks are possibly lost in loss record 913 of 942
==26697==    at 0x4C2BDE4: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==26697==    by 0x4011131: allocate_dtv (in /lib64/ld-2.16.so)
==26697==    by 0x401176D: _dl_allocate_tls (in /lib64/ld-2.16.so)
==26697==    by 0x8499602: pthread_create@@GLIBC_2.2.5 (in /lib64/libpthread-2.16.so)
==26697==    by 0x52F53E9: virThreadCreate (virthreadpthread.c:188)
==26697==    by 0x52F5D4F: virThreadPoolNew (virthreadpool.c:221)
==26697==    by 0x53F30DB: virNetServerNew (virnetserver.c:377)
==26697==    by 0x11C6ED: main (libvirtd.c:1366)

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/util/virthreadpool.c

index b1e2c0cbea47557953b3f3aa47503351bbbd05f3..99f36ec13bba702ee0177912f4b96dcd21ad96ce 100644 (file)
@@ -241,6 +241,9 @@ void virThreadPoolFree(virThreadPoolPtr pool)
 {
     virThreadPoolJobPtr job;
     bool priority = false;
+    size_t i;
+    size_t nWorkers = pool->nWorkers;
+    size_t nPrioWorkers = pool->nPrioWorkers;
 
     if (!pool)
         return;
@@ -262,6 +265,12 @@ void virThreadPoolFree(virThreadPoolPtr pool)
         VIR_FREE(job);
     }
 
+    for (i = 0; i < nWorkers; i++)
+        virThreadJoin(&pool->workers[i]);
+
+    for (i = 0; i < nPrioWorkers; i++)
+        virThreadJoin(&pool->prioWorkers[i]);
+
     VIR_FREE(pool->workers);
     virMutexUnlock(&pool->mutex);
     virMutexDestroy(&pool->mutex);