This change capitalizes on newly added support for dynamic thread stacks and the existing pthread support to provide an implementation of the ISO C11 `<threads.h>` API. Signed-off-by: Christopher Friedt <cfriedt@meta.com>
86 lines
1.3 KiB
C
86 lines
1.3 KiB
C
/*
|
|
* Copyright (c) 2023, Meta
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <errno.h>
|
|
#include <threads.h>
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/posix/pthread.h>
|
|
#include <zephyr/posix/sched.h>
|
|
|
|
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;
|
|
}
|
|
}
|