diff options
Diffstat (limited to 'nptl/pthread_mutex_timedlock.c')
-rw-r--r-- | nptl/pthread_mutex_timedlock.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/nptl/pthread_mutex_timedlock.c b/nptl/pthread_mutex_timedlock.c index 3a36424afa..689cefa2de 100644 --- a/nptl/pthread_mutex_timedlock.c +++ b/nptl/pthread_mutex_timedlock.c @@ -25,6 +25,17 @@ #include <stap-probe.h> +#ifndef lll_timedlock_elision +#define lll_timedlock_elision(a,dummy,b,c) lll_timedlock(a, b, c) +#endif + +#ifndef lll_trylock_elision +#define lll_trylock_elision(a,t) lll_trylock(a) +#endif + +#ifndef FORCE_ELISION +#define FORCE_ELISION(m, s) +#endif int pthread_mutex_timedlock (mutex, abstime) @@ -40,10 +51,11 @@ pthread_mutex_timedlock (mutex, abstime) /* We must not check ABSTIME here. If the thread does not block abstime must not be checked for a valid value. */ - switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex), + switch (__builtin_expect (PTHREAD_MUTEX_TYPE_ELISION (mutex), PTHREAD_MUTEX_TIMED_NP)) { /* Recursive mutex. */ + case PTHREAD_MUTEX_RECURSIVE_NP|PTHREAD_MUTEX_ELISION_NP: case PTHREAD_MUTEX_RECURSIVE_NP: /* Check whether we already hold the mutex. */ if (mutex->__data.__owner == id) @@ -78,12 +90,22 @@ pthread_mutex_timedlock (mutex, abstime) /* FALLTHROUGH */ case PTHREAD_MUTEX_TIMED_NP: + FORCE_ELISION (mutex, goto elision); simple: /* Normal mutex. */ result = lll_timedlock (mutex->__data.__lock, abstime, PTHREAD_MUTEX_PSHARED (mutex)); break; + case PTHREAD_MUTEX_TIMED_ELISION_NP: + elision: __attribute__((unused)) + /* Don't record ownership */ + return lll_timedlock_elision (mutex->__data.__lock, + mutex->__data.__spins, + abstime, + PTHREAD_MUTEX_PSHARED (mutex)); + + case PTHREAD_MUTEX_ADAPTIVE_NP: if (! __is_smp) goto simple; |