diff options
| author | Kacper <kacper@mail.openlinux.dev> | 2025-12-22 23:27:56 +0100 |
|---|---|---|
| committer | Kacper <kacper@mail.openlinux.dev> | 2025-12-22 23:30:32 +0100 |
| commit | 0f30d227497418c6d3bef7d52244407e30454504 (patch) | |
| tree | 0e1ac19623d3268380cf74328cdf643648a2f43c /lib/libc/thread/thrd_exit.c | |
| parent | 90dad97fc07f049383903a166631e2c257f9b8c1 (diff) | |
Added c11 threads, fixed some locks and add *_unlocked functions
Diffstat (limited to 'lib/libc/thread/thrd_exit.c')
| -rw-r--r-- | lib/libc/thread/thrd_exit.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/lib/libc/thread/thrd_exit.c b/lib/libc/thread/thrd_exit.c new file mode 100644 index 00000000..9ba1f54a --- /dev/null +++ b/lib/libc/thread/thrd_exit.c @@ -0,0 +1,25 @@ +#include <__thread.h> +#include <libc/futex.h> +#include <stdatomic.h> +#include <sys/mman.h> +#include <threads.h> +#include <unistd.h> + +_Noreturn void thrd_exit(int res) +{ + struct __thread_self *self = thrd_current(); + + self->res = res; + + int state = atomic_load_explicit((int *)&self->state, memory_order_seq_cst); + if (state == THREAD_STATE_DETACHED) { + if (self->map_base && self->map_size) + munmap(self->map_base, self->map_size); + _exit(0); + } + + atomic_store_explicit(&self->state, THREAD_STATE_EXITED, memory_order_seq_cst); + __futex_wake(&self->state, 1); + + _exit(0); +} |
