about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/thread/pthread_once.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/src/thread/pthread_once.c b/src/thread/pthread_once.c
index 41872f16..e01f6d48 100644
--- a/src/thread/pthread_once.c
+++ b/src/thread/pthread_once.c
@@ -18,7 +18,7 @@ int pthread_once(pthread_once_t *control, void (*init)(void))
 	 *  1 - another thread is running init; wait
 	 *  2 - another thread finished running init; just return */
 
-	for (;;) switch (a_swap(control, 1)) {
+	for (;;) switch (a_cas(control, 0, 1)) {
 	case 0:
 		pthread_cleanup_push(undo, control);
 		init();
@@ -31,7 +31,6 @@ int pthread_once(pthread_once_t *control, void (*init)(void))
 		__wait(control, &waiters, 1, 0);
 		continue;
 	case 2:
-		a_store(control, 2);
 		return 0;
 	}
 }