remove useless synchronization in exit and quick_exit
authorRich Felker <dalias@aerifal.cx>
Thu, 29 May 2014 20:35:09 +0000 (16:35 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 29 May 2014 20:35:09 +0000 (16:35 -0400)
calling exit more than once invokes undefined behavior. in some cases
it's desirable to detect undefined behavior and diagnose it via a
predictable crash, but the code here was silently covering up an
uncommon case (exit from more than one thread) and turning a much more
common case (recursive calls to exit) into a permanent hang.

src/exit/exit.c
src/exit/quick_exit.c

index 353f50b78ef1c9fb4b3d57c6947ec20d1f8ef620..695bdc0514f58a94428e65c559b9c45625f17de3 100644 (file)
@@ -1,8 +1,6 @@
 #include <stdlib.h>
 #include <stdint.h>
 #include "libc.h"
-#include "atomic.h"
-#include "syscall.h"
 
 static void dummy()
 {
@@ -21,11 +19,6 @@ extern void (*const __fini_array_end)() __attribute__((weak));
 
 _Noreturn void exit(int code)
 {
-       static int lock;
-
-       /* If more than one thread calls exit, hang until _Exit ends it all */
-       while (a_swap(&lock, 1)) __syscall(SYS_pause);
-
        __funcs_on_exit();
 
 #ifndef SHARED
index 1175d80cc49d3c8395101f6712726676ccf636e2..ada91348bf659a16af26a99c1667976c7b497244 100644 (file)
@@ -1,6 +1,4 @@
 #include <stdlib.h>
-#include "syscall.h"
-#include "atomic.h"
 #include "libc.h"
 
 static void dummy() { }
@@ -8,8 +6,6 @@ weak_alias(dummy, __funcs_on_quick_exit);
 
 _Noreturn void quick_exit(int code)
 {
-       static int lock;
-       while (a_swap(&lock, 1)) __syscall(SYS_pause);
        __funcs_on_quick_exit();
        _Exit(code);
 }