提交 7e6be42a 编写于 作者: R Rich Felker

fix major breakage in pthread_once (it was always deadlocking)

the issue was a break statement that was breaking only from the
switch, not the enclosing for loop, and a failure to set the final
success state.
上级 4820f926
......@@ -20,7 +20,13 @@ int pthread_once(pthread_once_t *control, void (*init)(void))
for (;;) switch (a_swap(control, 1)) {
case 0:
break;
pthread_cleanup_push(undo, control);
init();
pthread_cleanup_pop(0);
a_store(control, 2);
if (waiters) __wake(control, -1, 0);
return 0;
case 1:
__wait(control, &waiters, 1, 0);
continue;
......@@ -28,11 +34,4 @@ int pthread_once(pthread_once_t *control, void (*init)(void))
a_store(control, 2);
return 0;
}
pthread_cleanup_push(undo, control);
init();
pthread_cleanup_pop(0);
if (waiters) __wake(control, -1, 0);
return 0;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册