remove __lock dependency from exit
authorRich Felker <dalias@aerifal.cx>
Fri, 11 May 2012 02:16:15 +0000 (22:16 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 11 May 2012 02:16:15 +0000 (22:16 -0400)
there's no sense in using a powerful lock in exit, because it will
never be unlocked. a thread that arrives at exit while exit is already
in progress just needs to hang forever. use the pause syscall for this
because it's cheap and easy and universally available.

src/exit/exit.c

index ae557c090d1793220764dc413267a4e8e29c5e35..fc2914844959eac78a3f76dccb302ef0d3d8fe25 100644 (file)
@@ -2,6 +2,8 @@
 #include <unistd.h>
 #include <stdio.h>
 #include "libc.h"
+#include "atomic.h"
+#include "syscall.h"
 
 static void dummy()
 {
@@ -13,10 +15,10 @@ weak_alias(dummy, __fflush_on_exit);
 
 void exit(int code)
 {
-       static int lock[2];
+       static int lock;
 
        /* If more than one thread calls exit, hang until _Exit ends it all */
-       LOCK(lock);
+       while (a_swap(&lock, 1)) __syscall(SYS_pause);
 
        /* Only do atexit & stdio flush if they were actually used */
        __funcs_on_exit();