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
| | #include "pthread_impl.h"
#include <threads.h>
int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec *restrict ts);
int mtx_timedlock(mtx_t *restrict mutex, const struct timespec *restrict ts) {
/* In the best of all worlds this is a tail call. */
int ret = __pthread_mutex_timedlock(mutex, ts);
switch (ret) {
case 0:
if (thrd_success == 0) break;
else return thrd_success;
case ETIMEDOUT:
if (thrd_timedout == ETIMEDOUT) break;
else return thrd_timedout;
case EINVAL:
if (thrd_error == EINVAL) break;
else return thrd_error;
}
/* In case of UB may also return 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. */
return ret;
}
|