[libvirt] [PATCH] virThreadPoolFree: Join worker threads

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 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/util/virthreadpool.c b/src/util/virthreadpool.c index b1e2c0c..99f36ec 100644 --- a/src/util/virthreadpool.c +++ b/src/util/virthreadpool.c @@ -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); -- 1.8.4.4

On 12/04/2013 06:05 AM, Michal Privoznik wrote:
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 | 9 +++++++++ 1 file changed, 9 insertions(+)
ACK. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On Wed, Dec 04, 2013 at 02:05:24PM +0100, Michal Privoznik wrote:
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 | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/src/util/virthreadpool.c b/src/util/virthreadpool.c index b1e2c0c..99f36ec 100644 --- a/src/util/virthreadpool.c +++ b/src/util/virthreadpool.c @@ -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);
ACK, looks nicer Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
participants (3)
-
Daniel P. Berrange
-
Eric Blake
-
Michal Privoznik