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