blob: c10ff32fb9b6a47a3b93906608709a70270d2184 [file] [log] [blame]
#include "threads_impl.h"
int __pthread_mutex_trylock_owner(pthread_mutex_t* m) {
int old, own;
int type = m->_m_type & PTHREAD_MUTEX_MASK;
int tid = __thread_get_tid();
old = atomic_load(&m->_m_lock);
own = old & PTHREAD_MUTEX_OWNED_LOCK_MASK;
if (own == tid && (type & PTHREAD_MUTEX_MASK) == PTHREAD_MUTEX_RECURSIVE) {
if ((unsigned)m->_m_count >= INT_MAX)
return EAGAIN;
m->_m_count++;
return 0;
}
if (own || a_cas_shim(&m->_m_lock, old, tid) != old) {
return EBUSY;
}
return 0;
}
int pthread_mutex_trylock(pthread_mutex_t* m) {
if ((m->_m_type & PTHREAD_MUTEX_MASK) == PTHREAD_MUTEX_NORMAL)
return a_cas_shim(&m->_m_lock, 0, EBUSY) & EBUSY;
return __pthread_mutex_trylock_owner(m);
}