Race-condition fix with free_waiter threads during shutdown.
authorKonrad Rzeszutek <konrad@virtualiron.com>
Tue, 24 Mar 2009 17:49:14 +0000 (18:49 +0100)
committerChristophe Varoqui <christophe.varoqui@free.fr>
Tue, 24 Mar 2009 17:49:14 +0000 (18:49 +0100)
commita403f57b991f3be7c7ea6250d95fad1554c9d6ca
tree8f0fa74a9ca07e58f91df19d9e6f0262aa37ea1f
parent57a6c5c72399df8b90c8a75666dd812b7b549ccd
Race-condition fix with free_waiter threads during shutdown.

When we shutdown, the main process locks the mutex, causing
all of the free_waiter functions to pile up on their lock.
Once we unlock in the main process, all of the free_waiters
start working. However the next instruction in the main proces
is to destroy the mutex. The short window is all the free_waiter
threads have to do their cleanup before they attempt to unlock
the mutex - which might have been de-allocated (and set to NULL).
End result can be a seg-fault.

This fix adds a ref-count to the mutex so that during shutdown
we spin and wait until all of the free_waiter functions
have completed and the ref-count is set to zero.
libmultipath/lock.c
libmultipath/lock.h
libmultipath/structs_vec.h
libmultipath/waiter.c
multipath/main.c
multipathd/main.c