Clean up some of the threading code

This commit is contained in:
Justine Tunney 2022-09-08 11:54:56 -07:00
parent 0547eabcd6
commit 9f963dc597
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
62 changed files with 175 additions and 582 deletions

View file

@ -45,20 +45,21 @@
*/
int pthread_once(pthread_once_t *once, void init(void)) {
char old;
switch ((old = atomic_load_explicit(once, memory_order_relaxed))) {
switch ((old = atomic_load_explicit(&once->lock, memory_order_relaxed))) {
case INIT:
if (atomic_compare_exchange_strong_explicit(once, &old, CALLING,
if (atomic_compare_exchange_strong_explicit(&once->lock, &old, CALLING,
memory_order_acquire,
memory_order_relaxed)) {
init();
atomic_store(once, FINISHED);
atomic_store(&once->lock, FINISHED);
break;
}
// fallthrough
case CALLING:
do {
pthread_yield();
} while (atomic_load_explicit(once, memory_order_relaxed) == CALLING);
} while (atomic_load_explicit(&once->lock, memory_order_relaxed) ==
CALLING);
break;
case FINISHED:
break;