From 0f30d227497418c6d3bef7d52244407e30454504 Mon Sep 17 00:00:00 2001 From: Kacper Date: Mon, 22 Dec 2025 23:27:56 +0100 Subject: Added c11 threads, fixed some locks and add *_unlocked functions --- lib/libc/thread/thrd_join.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 lib/libc/thread/thrd_join.c (limited to 'lib/libc/thread/thrd_join.c') diff --git a/lib/libc/thread/thrd_join.c b/lib/libc/thread/thrd_join.c new file mode 100644 index 00000000..7ec38c4a --- /dev/null +++ b/lib/libc/thread/thrd_join.c @@ -0,0 +1,37 @@ +#include <__thread.h> +#include +#include +#include +#include + +int thrd_join(thrd_t thr, int *res) +{ + struct __thread_self *tcb = (struct __thread_self *)thr; + if (tcb == NULL) + return thrd_error; + + int state = atomic_load_explicit(&tcb->state, memory_order_seq_cst); + if (state == THREAD_STATE_DETACHED) + return thrd_error; // Cannot join a detached thread + + while (atomic_load_explicit(&tcb->state, memory_order_seq_cst) != THREAD_STATE_EXITED) { + int cur = atomic_load_explicit(&tcb->state, memory_order_seq_cst); + int r = __futex_wait((volatile int *)&tcb->state, cur); + if (r < 0) + return thrd_error; + } + + if (res) { + *res = tcb->res; + } + + atomic_store_explicit(&tcb->state, THREAD_STATE_JOINABLE, memory_order_seq_cst); + __futex_wake((volatile int *)&tcb->state, 1); + + if (tcb->map_base == NULL || tcb->map_size == 0) + return thrd_error; + + munmap(tcb->map_base, tcb->map_size); + + return thrd_success; +} -- cgit v1.2.3