diff --git a/nptl/pthread_mutex_trylock.c b/nptl/pthread_mutex_trylock.c index 9b3a16954d..4ac283414d 100644 --- a/nptl/pthread_mutex_trylock.c +++ b/nptl/pthread_mutex_trylock.c @@ -48,7 +48,8 @@ ___pthread_mutex_trylock (pthread_mutex_t *mutex) return 0; } - if (lll_trylock (mutex->__data.__lock) == 0) + if (atomic_load_relaxed (&(mutex->__data.__lock)) == 0 + && lll_trylock (mutex->__data.__lock) == 0) { /* Record the ownership. */ mutex->__data.__owner = id; @@ -71,7 +72,10 @@ ___pthread_mutex_trylock (pthread_mutex_t *mutex) /*FALL THROUGH*/ case PTHREAD_MUTEX_ADAPTIVE_NP: case PTHREAD_MUTEX_ERRORCHECK_NP: - if (lll_trylock (mutex->__data.__lock) != 0) + /* Mutex type is already loaded, lock check overhead should + be minimal. */ + if (atomic_load_relaxed (&(mutex->__data.__lock)) != 0 + || lll_trylock (mutex->__data.__lock) != 0) break; /* Record the ownership. */