#include "pthread_impl.h" #include int __mtx_unlock(__mtx_t *mtx) { int ret = thrd_success; if ((mtx->_mt_typ&3) == PTHREAD_MUTEX_RECURSIVE && mtx->_mt_cnt) { if ((mtx->_mt_lck&0x1fffffff) != __pthread_self()->tid) ret = thrd_error; /* _m_count is the count of additional locks, no need to real unlock */ else --mtx->_mt_cnt; } else { if (a_swap(&mtx->_mt_lck, 0)<0 || mtx->_mt_wts) __syscall(SYS_futex, &mtx->_mt_lck, FUTEX_WAKE|THRD_PRIVATE, 1); } return ret; } int mtx_unlock(mtx_t *mut) { int ret = thrd_error; __mtx_t * m = __mtx_getref(mut); if (m) { ret = __mtx_unlock(m); __mtx_unref(m); } return ret; }