comp: forward signals instead of exiting
authorJean Privat <jean@pryen.org>
Fri, 20 Mar 2015 01:55:58 +0000 (08:55 +0700)
committerJean Privat <jean@pryen.org>
Sat, 21 Mar 2015 03:13:39 +0000 (10:13 +0700)
Exit status of process distinguishes normal termination `WIFEXITED`
and signal-caused termination `WIFSIGNALED`.
Shells and other commands use this information to handle sub-commands.

Therefore, compiled programs should not, by default, terminate
their signal handler by an `exit` but should rethrow the original signal.

Signed-off-by: Jean Privat <jean@pryen.org>

src/compiler/abstract_compiler.nit

index 8dd0b8b..1ec7761 100644 (file)
@@ -741,12 +741,7 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref );
                        v.compiler.header.add_decl("extern long count_isset_checks;")
                end
 
-               v.add_decl("void sig_handler(int signo)\{")
-               v.add_decl("PRINT_ERROR(\"Caught signal : %s\\n\", strsignal(signo));")
-               v.add_decl("fatal_exit(signo);")
-               v.add_decl("\}")
-
-               v.add_decl("void fatal_exit(int signo) \{")
+               v.add_decl("static void show_backtrace(void) \{")
                if ost == "nitstack" or ost == "libunwind" then
                        v.add_decl("char* opt = getenv(\"NIT_NO_STACK\");")
                        v.add_decl("unw_cursor_t cursor;")
@@ -776,7 +771,19 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref );
                        v.add_decl("free(procname);")
                        v.add_decl("\}")
                end
-               v.add_decl("exit(signo);")
+               v.add_decl("\}")
+
+               v.add_decl("void sig_handler(int signo)\{")
+               v.add_decl("PRINT_ERROR(\"Caught signal : %s\\n\", strsignal(signo));")
+               v.add_decl("show_backtrace();")
+               # rethrows
+               v.add_decl("signal(signo, SIG_DFL);")
+               v.add_decl("kill(getpid(), signo);")
+               v.add_decl("\}")
+
+               v.add_decl("void fatal_exit(int status) \{")
+               v.add_decl("show_backtrace();")
+               v.add_decl("exit(status);")
                v.add_decl("\}")
 
                if no_main then