X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fsignal.c;h=ed7d495e4d9273953ea74f2f25532f09e509fdbc;hb=cce34f898a508bde05c54be7f19c0fbfeb2dc0a2;hp=39e1c6b22455211b34828b3d7cf93159b7736b32;hpb=70bd214ee92d267a4bcfb4dbe2dc6e8e0d2c6a51;p=cacao.git diff --git a/src/vm/signal.c b/src/vm/signal.c index 39e1c6b22..ed7d495e4 100644 --- a/src/vm/signal.c +++ b/src/vm/signal.c @@ -39,16 +39,22 @@ #include "arch.h" -#include "threads/thread.h" +#if defined(ENABLE_GC_BOEHM) +# include "mm/memory.h" +#endif -#include "vm/exceptions.h" -#include "vm/signallocal.h" -#include "vm/vm.h" +#include "threads/thread.hpp" +#include "threads/threadlist.hpp" -#include "vmcore/options.h" +#include "vm/exceptions.hpp" +#include "vm/globals.hpp" +#include "vm/method.hpp" +#include "vm/options.h" +#include "vm/signallocal.h" +#include "vm/vm.hpp" #if defined(ENABLE_STATISTICS) -# include "vmcore/statistics.h" +# include "vm/statistics.h" #endif @@ -82,7 +88,7 @@ bool signal_init(void) if (sigemptyset(&mask) != 0) vm_abort_errno("signal_init: sigemptyset failed"); -#if !defined(WITH_CLASSPATH_SUN) +#if !defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) /* Let OpenJDK handle SIGINT itself. */ if (sigaddset(&mask, SIGINT) != 0) @@ -133,7 +139,7 @@ bool signal_init(void) SA_NODEFER | SA_SIGINFO); # endif -# if defined(__ARM__) || defined(__I386__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__) +# if defined(__ALPHA__) || defined(__ARM__) || defined(__I386__) || defined(__MIPS__) || defined(__POWERPC__) || defined(__POWERPC64__) || defined(__S390__) || defined(__X86_64__) || defined(__M68K__) /* XXX use better defines for that (in arch.h) */ /* SIGILL handler */ @@ -185,7 +191,7 @@ bool signal_init(void) #if defined(ENABLE_THREADS) /* SIGHUP handler for threads_thread_interrupt */ - signal_register_signal(SIGHUP, (functionptr) signal_handler_sighup, 0); + signal_register_signal(Signal_INTERRUPT_SYSTEM_CALL, (functionptr) signal_handler_sighup, 0); #endif #if defined(ENABLE_THREADS) && defined(ENABLE_GC_CACAO) @@ -246,13 +252,14 @@ static void signal_thread(void) threadobject *t; sigset_t mask; int sig; + int result; t = THREADOBJECT; if (sigemptyset(&mask) != 0) vm_abort_errno("signal_thread: sigemptyset failed"); -#if !defined(WITH_CLASSPATH_SUN) +#if !defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) /* Let OpenJDK handle SIGINT itself. */ if (sigaddset(&mask, SIGINT) != 0) @@ -271,14 +278,14 @@ static void signal_thread(void) thread_set_state_waiting(t); #endif - /* XXX We don't check for an error here, although the man-page - states sigwait does not return an error (which is wrong!), - but it seems to make problems with Boehm-GC. We should - revisit this code with our new exact-GC. */ + // sigwait can return EINTR (unlike what the Linux man-page + // says). + do { + result = sigwait(&mask, &sig); + } while (result == EINTR); -/* if (sigwait(&mask, &sig) != 0) */ -/* vm_abort_errno("signal_thread: sigwait failed"); */ - (void) sigwait(&mask, &sig); + if (result != 0) + vm_abort_errnum(result, "signal_thread: sigwait failed"); #if defined(ENABLE_THREADS) thread_set_state_runnable(t); @@ -304,13 +311,13 @@ void signal_thread_handler(int sig) case SIGINT: /* exit the vm properly */ - vm_exit(0); + vm_exit(1); break; case SIGQUIT: /* print a thread dump */ #if defined(ENABLE_THREADS) - threads_dump(); + ThreadList_dump_threads(); #endif #if defined(ENABLE_STATISTICS) @@ -318,6 +325,24 @@ void signal_thread_handler(int sig) statistics_print_memory_usage(); #endif break; + +#if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK) + default: { + // For OpenJDK we dispatch all unknown signals to Java. + methodinfo* m = class_resolvemethod(class_sun_misc_Signal, utf_dispatch, utf_int__void); + (void) vm_call_method(m, NULL, sig); + + if (exceptions_get_exception()) { + log_println("signal_thread_handler: Java signal handler throw an exception while dispatching signal %d:", sig); + exceptions_print_stacktrace(); + vm_abort("signal_thread_handler: Aborting..."); + } + break; + } +#else + default: + vm_abort("signal_thread_handler: Unknown signal %d", sig); +#endif } }