[libvirt] [PATCH 1/14] Adding recursive locks

Daniel P. Berrange berrange at redhat.com
Thu Mar 18 17:21:24 UTC 2010


On Thu, Mar 18, 2010 at 11:16:09AM -0600, Eric Blake wrote:
> On 03/18/2010 11:04 AM, Eric Blake wrote:
> > But what does a true non-recursive mutex buy you?  The only difference
> > between recursive and true non-recursive is whether you declare that an
> > attempt to relock a mutex that you already own is a fatal deadlock
> > error, rather than incrementing a counter for matching unlocks.  It's
> > just that non-recursive mutexes typically have faster implementations.
> 
> Actually, it DOES buy something.  virCondWait DEPENDS on getting a true
> non-recursive function (PTHREAD_MUTEX_NORMAL or
> PTHREAD_MUTEX_ERRORCHECK, although the latter has better guaranteed
> behavior in the case of deadlock), because POSIX is clear that:
> 
> 
>     It is advised that an application should not use a
> PTHREAD_MUTEX_RECURSIVE mutex with condition variables because the
> implicit unlock performed for a pthread_cond_timedwait() or
> pthread_cond_wait() may not actually release the mutex (if it had been
> locked multiple times). If this happens, no other thread can satisfy the
> condition of the predicate.
> 
> > 
> > For that matter, do we even need the distinction?  Maybe ALL our code
> > should be using recursive mutexes by default, by changing virMutexInit
> > to be recursive no matter what, and not worry about introducing
> > virMutexInitRecursive.  Looking more closely at virMutexInit in the
> > pthreads version, we use pthread_mutex_init(,NULL), which requests
> > PTHREAD_MUTEX_DEFAULT.
> 
> > That is, our current implementation of virMutexInit is NOT a true
> > non-recursive mutex, so much as a mutex that is unspecified whether it
> > is recursive or not.
> >
> 
> And that means we have a bug in threads-pthread.c - we should be
> explicitly requesting a pthread_mutexattr with PTHREAD_MUTEX_ERRORCHECK
> rather than relying on NULL.

No, we should set  PTHREAD_MUTEX_NORMAL - we don't want it returning an
error code on failure, because all our code assumes pthread_mutex_lock
will not fail. Deadlock is what we want.

Daniel
-- 
|: Red Hat, Engineering, London    -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org        -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list