1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| | #include "pthread_impl.h"
#include <threads.h>
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;
}
|