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_cond_timedwait(pthread_cond_t *restrict c, pthread_mutex_t *restrict m, const struct timespec *restrict ts);
int cnd_timedwait(cnd_t *restrict cond, mtx_t *restrict mutex, const struct timespec *restrict ts) {
/* In the best of all worlds this is a tail call. */
int ret = __pthread_cond_timedwait(cond, 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. */
return ret;
}
|