LibC: Implement `pthread_once`
This commit is contained in:
parent
2cbfe70a28
commit
5d8dd090a9
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue