/* * Copyright (c) 2023, Meta * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include struct thrd_trampoline_arg { thrd_start_t func; void *arg; }; int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) { typedef void *(*pthread_func_t)(void *arg); pthread_func_t pfunc = (pthread_func_t)func; switch (pthread_create(thr, NULL, pfunc, arg)) { case 0: return thrd_success; case EAGAIN: return thrd_nomem; default: return thrd_error; } } int thrd_equal(thrd_t lhs, thrd_t rhs) { return pthread_equal(lhs, rhs); } thrd_t thrd_current(void) { return pthread_self(); } int thrd_sleep(const struct timespec *duration, struct timespec *remaining) { return nanosleep(duration, remaining); } void thrd_yield(void) { (void)sched_yield(); } FUNC_NORETURN void thrd_exit(int res) { pthread_exit(INT_TO_POINTER(res)); CODE_UNREACHABLE; } int thrd_detach(thrd_t thr) { switch (pthread_detach(thr)) { case 0: return thrd_success; default: return thrd_error; } } int thrd_join(thrd_t thr, int *res) { void *ret; switch (pthread_join(thr, &ret)) { case 0: if (res != NULL) { *res = POINTER_TO_INT(ret); } return thrd_success; default: return thrd_error; } }