#include "pthread_impl.h" #include int __mtx_trylock(__mtx_t *mtx) { int tid, old, own, ret = 0; pthread_t self; if (mtx->_mt_typ == PTHREAD_MUTEX_NORMAL) { return a_cas(&mtx->_mt_lck, 0, thrd_busy) & thrd_busy; } else { self = __pthread_self(); tid = self->tid; old = mtx->_mt_lck; own = old & 0x7fffffff; if (own == tid) { if ((unsigned)mtx->_mt_cnt >= INT_MAX) return thrd_error; else mtx->_mt_cnt++; } else { if ((own && !(own & 0x40000000)) || a_cas(&mtx->_mt_lck, old, tid)!=old) return thrd_busy; } } return thrd_success; } int mtx_trylock(mtx_t *mut) { __mtx_t * m = __mtx_getref(mut); if (!m) return thrd_error; int ret = __mtx_trylock(m); __mtx_unref(m); return ret; }