Disable elision for any pthread_mutexattr_settype call

PTHREAD_MUTEX_NORMAL requires deadlock for nesting, DEFAULT
does not. Since glibc uses the same value (0) disable elision
for any call to pthread_mutexattr_settype() with a 0 value.
This implies that a program can disable elision by doing
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL)

Based on a original proposal by Rich Felker.
This commit is contained in:
Andi Kleen 2013-06-27 11:15:06 -07:00
parent e8c659d74e
commit 49186d21ef
2 changed files with 10 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2013-07-02 Andi Kleen <ak@linux.intel.com>
* pthread_mutexattr_settype.c (__pthread_mutexattr_settype):
Disable elision for PTHREAD_MUTEX_DEFAULT.
2013-07-02 Andi Kleen <ak@linux.intel.com>
Hongjiu Lu <hongjiu.lu@intel.com>

View File

@ -30,6 +30,11 @@ __pthread_mutexattr_settype (attr, kind)
if (kind < PTHREAD_MUTEX_NORMAL || kind > PTHREAD_MUTEX_ADAPTIVE_NP)
return EINVAL;
/* Cannot distinguish between DEFAULT and NORMAL. So any settype
call disables elision for now. */
if (kind == PTHREAD_MUTEX_DEFAULT)
kind |= PTHREAD_MUTEX_NO_ELISION_NP;
iattr = (struct pthread_mutexattr *) attr;
iattr->mutexkind = (iattr->mutexkind & PTHREAD_MUTEXATTR_FLAG_BITS) | kind;