This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC][BZ #16159] Detecting that recursive mutex recursed.


On Wed, Nov 13, 2013 at 02:46:08PM +0100, Ondrej Bilka wrote:
> Hi,
> 
> To fix bugs with malloc async safety I would need a following primitive
> 
> int ptrhead_mutex_lock_cnt(pthread_mutex_t *m, int *cnt);
> 
> Which works like pthread_mutex_lock except it returns a number of times lock was recursively locked.
> This would allow us to detect that function was invoked in signal and provide safe workaround.

glibc's recursive mutexes are not reentrant, so this will not work.
You could detect the common case where the interrupted code had
already fully obtained the mutex, but not the race condition where
mutex acquisition itself was interrupted. (FYI I have a working
recursive+reentrant mutex implementation that avoids this issue.)

Anyway, this functionality is not needed for what you want. If
recursive mutexes were fixed to be reentrant, you could just use the
following logic:

    pthread_mutex_trylock(m) || pthread_mutex_lock(m);

This works because trylock will succeed if the calling thread already
is the owner of the recursive mutex; if not, pthread_mutex_lock is
safe to call.

Rich


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]