LibC: Implement `pthread_once`

This commit is contained in:
Bananymous 2025-04-21 14:01:38 +03:00
parent 2cbfe70a28
commit 5d8dd090a9
2 changed files with 18 additions and 1 deletions

View File

@ -46,13 +46,14 @@ struct uthread
#define PTHREAD_CREATE_JOINABLE 8 #define PTHREAD_CREATE_JOINABLE 8
#define PTHREAD_EXPLICIT_SCHED 9 #define PTHREAD_EXPLICIT_SCHED 9
#define PTHREAD_INHERIT_SCHED 10 #define PTHREAD_INHERIT_SCHED 10
#define PTHREAD_ONCE_INIT 17
#define PTHREAD_PRIO_INHERIT 18 #define PTHREAD_PRIO_INHERIT 18
#define PTHREAD_PRIO_NONE 19 #define PTHREAD_PRIO_NONE 19
#define PTHREAD_PRIO_PROTECT 20 #define PTHREAD_PRIO_PROTECT 20
#define PTHREAD_SCOPE_PROCESS 23 #define PTHREAD_SCOPE_PROCESS 23
#define PTHREAD_SCOPE_SYSTEM 24 #define PTHREAD_SCOPE_SYSTEM 24
#define PTHREAD_ONCE_INIT 0
#define PTHREAD_PROCESS_SHARED 0 #define PTHREAD_PROCESS_SHARED 0
#define PTHREAD_PROCESS_PRIVATE 1 #define PTHREAD_PROCESS_PRIVATE 1

View File

@ -312,6 +312,22 @@ pthread_t pthread_self(void)
#endif #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) int pthread_spin_destroy(pthread_spinlock_t* lock)
{ {
(void)lock; (void)lock;