Remove the #define exit() _exit() hack (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 8 Jun 2017 21:14:49 +0000 (17:14 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 20 Jul 2017 12:19:46 +0000 (08:19 -0400)
The atexit handlers might do dangerous things that can't be done in vcore
context.  The old note mentioned yielding, which we could work around, but
other handlers can block too. (confirmed by testing).

So we retain the "exit -> _exit" behavior for vcore context, but not for
uthreads.  Importantly, the change is done in glibc, instead of macro
nastiness.  This popped up when someone wanted to call a function pointer
named 'exit.'

Fun tidbit, this hack might have predated threads.  It came in less than a
week after the first pthread scheduler commit.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-existing.patch
user/parlib/include/parlib/vcore.h
user/parlib/signal.c

index b560a54..444c664 100644 (file)
@@ -495,3 +495,22 @@ diff -ruB --unidirectional-new-file ../glibc-2.19/sysdeps/x86_64/tlsdesc.sym ../
 +  _assert_failed(file, line, assertion);
  }
  hidden_def(__assert_fail)
+--- glibc-2.19/stdlib/exit.c   2017-06-08 17:05:17.558550998 -0400
++++ glibc-2.19-akaros/stdlib/exit.c    2017-06-08 17:04:50.574432434 -0400
+@@ -19,6 +19,7 @@
+ #include <stdlib.h>
+ #include <unistd.h>
+ #include <sysdep.h>
++#include <parlib/vcore.h>
+ #include "exit.h"
+ #include "set-hooks.h"
+@@ -101,6 +102,8 @@
+ void
+ exit (int status)
+ {
++  if (in_vcore_context())
++    _exit(status);
+   __run_exit_handlers (status, &__exit_funcs, true);
+ }
+ libc_hidden_def (exit)
index 679bed7..6e8f2ef 100644 (file)
@@ -9,18 +9,6 @@
 
 __BEGIN_DECLS
 
-/*****************************************************************************/
-/* TODO: This is a complete hack, but necessary for vcore stuff to work for now
- * The issue is that exit sometimes calls sys_yield(), and we can't recover from
- * that properly under our vcore model (we shouldn't though).  We really need to
- * rethink what sys_yield 'should' do when in multicore mode, or else come up 
- * with a different syscall entirely. */
-#undef exit
-extern void _exit (int status);
-extern void exit (int __status) __THROW __attribute__ ((__noreturn__));
-#define exit(status) _exit(status)
-/*****************************************************************************/
-
 #define TRANSITION_STACK_PAGES 2
 #define TRANSITION_STACK_SIZE (TRANSITION_STACK_PAGES*PGSIZE)
 
index 5daff3c..48f637d 100644 (file)
@@ -34,6 +34,7 @@
 #include <parlib/event.h>
 #include <parlib/ros_debug.h>
 #include <errno.h>
+#include <stdlib.h>
 #include <parlib/assert.h>
 #include <ros/procinfo.h>
 #include <ros/syscall.h>