1 #include "threads_impl.h"
2 
__pthread_mutex_trylock_owner(pthread_mutex_t * m)3 int __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 
pthread_mutex_trylock(pthread_mutex_t * m)24 int 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