forked from Bananymous/banan-os
				
			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