1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| | #include "pthread_impl.h"
#include <threads.h>
int __pthread_mutex_trylock(pthread_mutex_t *restrict m);
int mtx_trylock(mtx_t *restrict m) {
if (m->_m_type == PTHREAD_MUTEX_NORMAL)
return (a_cas(&m->_m_lock, 0, EBUSY) & EBUSY) ? thrd_busy : thrd_success;
/* In the best of all worlds this is a tail call. */
int ret = __pthread_mutex_trylock(m);
switch (ret) {
/* In case of UB may also return EINVAL, EPERM, EDEADLK or EAGAIN. EAGAIN is
specially tricky since C11 doesn't define how many recursive
calls can be done. (this *isn't* the maximum amount of nested
calls!) This implementation here deals this with a counter and
detects overflow, so this is definitively UB. */
default: return thrd_error;
case 0: return thrd_success;
case EBUSY: return thrd_busy;
}
}
|