On Thu, May 21, 2015 at 12:18:32 +0100, Daniel P. Berrange wrote: > On Thu, May 21, 2015 at 01:09:37PM +0200, Jiri Denemark wrote: > > On Thu, May 21, 2015 at 11:19:05 +0100, Daniel P. Berrange wrote: > > > On Thu, May 21, 2015 at 11:57:52AM +0200, Jiri Denemark wrote: > > > > Using joinable threads does not help anything, but it can lead to memory > > > > leaks. > > > > > > > > When a worker thread exits, it decreases nWorkers or nPrioWorkers and > > > > once both nWorkers and nPrioWorkers are zero (i.e., the last worker is > > > > gone), quit_cond is signaled. When freeing the pool we first tell all > > > > threads to die and then we are waiting for both nWorkers and > > > > nPrioWorkers to become zero. At this point we already know all threads > > > > are gone. So the only reason for calling virThreadJoin of all workers is > > > > to free the memory allocated for joinable threads. If we avoid > > > > allocating this memory, we don't need to take care of freeing it. > > > > > > The idea behind thread join was to make debugging with valgrind better. > > > By waiting for the threads to shutdown we ensure that all memory they > > > are using has been free before libvirtd exits, so valgrind doesn't > > > report bogus leaks. > > > > Detached threads don't consume any memory by themselves (while joinable > > threads do), so there's no memory that needs to be freed. And if we are > > concerned about the memory allocated by the code the thread is > > executing, we are safe too, since we already wait for all threads to > > die. A few lines above the virThreadJoin, the following loop handles it: > > > > while (pool->nWorkers > 0 || pool->nPrioWorkers > 0) > > ignore_value(virCondWait(&pool->quit_cond, &pool->mutex)); > > > > > Another reason for using Join is that it allows the threads to finish > > > processing whatever RPC/API call they were currently handling. If we > > > daemonize all threads, then I believe that would allow libvirtd to > > > exit while we were in the middle of performing some change on QEMU. > > > This seems like it could well lead to inconsistent state where we had > > > updated QEMU, but not our state XML, or vica-verca. > > > > We wait for all thread to finish their processing anyway, so when the > > code gets to virThreadJoin, we already know all threads are gone. > > Ok, yes, i see that now looking more closely at the code. > > ACK Pushed, thanks. Jirka -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list