1#include "threads_impl.h" 2 3int __pthread_mutex_trylock_owner(pthread_mutex_t* m) { 4 int old, own; 5 int type = m->_m_type & PTHREAD_MUTEX_MASK; 6 int tid = __thread_get_tid(); 7 8 old = atomic_load(&m->_m_lock); 9 own = old & PTHREAD_MUTEX_OWNED_LOCK_MASK; 10 if (own == tid && (type & PTHREAD_MUTEX_MASK) == PTHREAD_MUTEX_RECURSIVE) { 11 if ((unsigned)m->_m_count >= INT_MAX) 12 return EAGAIN; 13 m->_m_count++; 14 return 0; 15 } 16 17 if (own || a_cas_shim(&m->_m_lock, old, tid) != old) { 18 return EBUSY; 19 } 20 21 return 0; 22} 23 24int pthread_mutex_trylock(pthread_mutex_t* m) { 25 if ((m->_m_type & PTHREAD_MUTEX_MASK) == PTHREAD_MUTEX_NORMAL) 26 return a_cas_shim(&m->_m_lock, 0, EBUSY) & EBUSY; 27 return __pthread_mutex_trylock_owner(m); 28} 29