From 5d8dd090a925dc02b049917166e8f56d21dda1d9 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 21 Apr 2025 14:01:38 +0300 Subject: [PATCH] LibC: Implement `pthread_once` --- userspace/libraries/LibC/include/pthread.h | 3 ++- userspace/libraries/LibC/pthread.cpp | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/userspace/libraries/LibC/include/pthread.h b/userspace/libraries/LibC/include/pthread.h index 04318efa..ea656dcc 100644 --- a/userspace/libraries/LibC/include/pthread.h +++ b/userspace/libraries/LibC/include/pthread.h @@ -46,13 +46,14 @@ struct uthread #define PTHREAD_CREATE_JOINABLE 8 #define PTHREAD_EXPLICIT_SCHED 9 #define PTHREAD_INHERIT_SCHED 10 -#define PTHREAD_ONCE_INIT 17 #define PTHREAD_PRIO_INHERIT 18 #define PTHREAD_PRIO_NONE 19 #define PTHREAD_PRIO_PROTECT 20 #define PTHREAD_SCOPE_PROCESS 23 #define PTHREAD_SCOPE_SYSTEM 24 +#define PTHREAD_ONCE_INIT 0 + #define PTHREAD_PROCESS_SHARED 0 #define PTHREAD_PROCESS_PRIVATE 1 diff --git a/userspace/libraries/LibC/pthread.cpp b/userspace/libraries/LibC/pthread.cpp index 2921c0ef..fb2da09d 100644 --- a/userspace/libraries/LibC/pthread.cpp +++ b/userspace/libraries/LibC/pthread.cpp @@ -312,6 +312,22 @@ pthread_t pthread_self(void) #endif } +int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)) +{ + static_assert(PTHREAD_ONCE_INIT == 0); + + pthread_once_t expected = 0; + if (BAN::atomic_compare_exchange(*once_control, expected, 1)) + { + init_routine(); + BAN::atomic_store(*once_control, 2); + } + + while (BAN::atomic_load(*once_control) != 2) + sched_yield(); + return 0; +} + int pthread_spin_destroy(pthread_spinlock_t* lock) { (void)lock;