This is the mail archive of the
mailing list for the glibc project.
Re: [PATCH] Correct mutex type check for disable lock elision via pthread_mutexattr_settype call
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: Stefan Liebler <stli at linux dot vnet dot ibm dot com>
- Cc: libc-alpha at sourceware dot org
- Date: Fri, 23 May 2014 15:51:56 +0200
- Subject: Re: [PATCH] Correct mutex type check for disable lock elision via pthread_mutexattr_settype call
- Authentication-results: sourceware.org; auth=none
- References: <lhdtdc$ek0$1 at ger dot gmane dot org>
On Tue, Apr 01, 2014 at 10:29:32AM +0200, Stefan Liebler wrote:
> if glibc is build with --enable-lock-elision=yes,
> all default mutexes are elided (only for supported architectures).
> Someone can disable the elision for one specific mutex with
> a call to pthread_mutexattr_settype.
> Currently you can specify either PTHREAD_MUTEX_NORMAL or
> PTHREAD_MUTEX_DEFAULT, because they are both defined to 0.
> The function checks for type PTHREAD_MUTEX_DEFAULT
> and then disables elision.
> For correctness, the function should check against PTHREAD_MUTEX_NORMAL!
> According to POSIX, PTHREAD_MUTEX_NORMAL shall deadlock if a thread
> tries to relock a mutex without first unlocking it.
> In case of PTHREAD_MUTEX_DEFAULT, the behavior is undefined.
> Thus the mutex can be elided with PTHREAD_MUTEX_DEFAULT, but not
> with PTHREAD_MUTEX_NORMAL.
> The same can be read in the lock elision implementation guidelines
> 2014-04-01 Stefan Liebler <firstname.lastname@example.org>
> * nptl/pthread_mutexattr_settype.c
> Disable lock elision for PTHREAD_MUTEX_NORMAL.
> diff --git a/nptl/pthread_mutexattr_settype.c b/nptl/pthread_mutexattr_settype.c
> index 0e91292..cf648cf 100644
> --- a/nptl/pthread_mutexattr_settype.c
> +++ b/nptl/pthread_mutexattr_settype.c
> @@ -32,7 +32,7 @@ __pthread_mutexattr_settype (attr, kind)
> /* Cannot distinguish between DEFAULT and NORMAL. So any settype
> call disables elision for now. */
> - if (kind == PTHREAD_MUTEX_DEFAULT)
> + if (kind == PTHREAD_MUTEX_NORMAL)
> kind |= PTHREAD_MUTEX_NO_ELISION_NP;
> iattr = (struct pthread_mutexattr *) attr;