* Merged in twisti-branch.
[cacao.git] / src / vm / signal.c
index 17279a70c89877aac7c316a86b9d5addc1aa5471..f9cc702ec2b8d950736ee0c76189ce43ccef4f7d 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: signal.c 7246 2007-01-29 18:49:05Z twisti $
+   $Id: signal.c 7592 2007-03-28 20:12:33Z twisti $
 
 */
 
 
 #include "vm/types.h"
 
-#include "mm/memory.h"
-
-#include "native/jni.h"
-#include "native/include/java_lang_Thread.h"
+#include "arch.h"
 
-#if defined(WITH_CLASSPATH_GNU)
-# include "native/include/java_lang_VMThread.h"
-#endif
+#include "mm/memory.h"
 
 #if defined(ENABLE_THREADS)
-# include "threads/native/threads.h"
+# include "threads/threads-common.h"
 #endif
 
-#include "vm/builtin.h"
 #include "vm/signallocal.h"
-#include "vm/stringlocal.h"
 #include "vm/vm.h"
-#include "vm/jit/stacktrace.h"
 
 #include "vmcore/options.h"
 
@@ -87,8 +79,8 @@ void signal_init(void)
 {
 #if !defined(__CYGWIN__)
        int              pagesize;
-       struct sigaction act;
        sigset_t         mask;
+       struct sigaction act;
 
        /* mmap a memory page at address 0x0, so our hardware-exceptions
           work. */
@@ -97,6 +89,24 @@ void signal_init(void)
 
        (void) memory_mmap_anon(NULL, pagesize, PROT_NONE, MAP_PRIVATE | MAP_FIXED);
 
+       /* Block the following signals (SIGINT for <ctrl>-c, SIGQUIT for
+          <ctrl>-\).  We enable them later in signal_thread, but only for
+          this thread. */
+
+       if (sigemptyset(&mask) != 0)
+               vm_abort("signal_init: sigemptyset failed: %s", strerror(errno));
+
+       if (sigaddset(&mask, SIGINT) != 0)
+               vm_abort("signal_init: sigaddset failed: %s", strerror(errno));
+
+#if !defined(__FREEBSD__)
+       if (sigaddset(&mask, SIGQUIT) != 0)
+               vm_abort("signal_init: sigaddset failed: %s", strerror(errno));
+#endif
+
+       if (sigprocmask(SIG_BLOCK, &mask, NULL) != 0)
+               vm_abort("signal_init: sigprocmask failed: %s", strerror(errno));
+
 #if defined(ENABLE_GC_BOEHM)
        /* Allocate something so the garbage collector's signal handlers
           are installed. */
@@ -118,21 +128,39 @@ void signal_init(void)
                act.sa_sigaction = md_signal_handler_sigsegv;
                act.sa_flags     = SA_NODEFER | SA_SIGINFO;
 
-#if defined(SIGSEGV)
+#  if defined(SIGSEGV)
                sigaction(SIGSEGV, &act, NULL);
-#endif
+#  endif
 
-#if defined(SIGBUS)
+#  if defined(SIGBUS)
                sigaction(SIGBUS, &act, NULL);
-#endif
+#  endif
 
-#if SUPPORT_HARDWARE_DIVIDE_BY_ZERO
+#  if SUPPORT_HARDWARE_DIVIDE_BY_ZERO
                /* SIGFPE handler */
 
                act.sa_sigaction = md_signal_handler_sigfpe;
                act.sa_flags     = SA_NODEFER | SA_SIGINFO;
                sigaction(SIGFPE, &act, NULL);
-#endif
+#  endif
+
+#  if defined(__ARM__)
+               /* XXX use better defines for that (in arch.h) */
+               /* SIGILL handler */
+
+               act.sa_sigaction = md_signal_handler_sigill;
+               act.sa_flags     = SA_NODEFER | SA_SIGINFO;
+               sigaction(SIGILL, &act, NULL);
+#  endif
+
+#  if defined(__POWERPC__)
+               /* XXX use better defines for that (in arch.h) */
+               /* SIGTRAP handler */
+
+               act.sa_sigaction = md_signal_handler_sigtrap;
+               act.sa_flags     = SA_NODEFER | SA_SIGINFO;
+               sigaction(SIGTRAP, &act, NULL);
+#  endif
 # if defined(ENABLE_INTRP)
        }
 # endif
@@ -154,17 +182,6 @@ void signal_init(void)
        sigaction(SIGUSR2, &act, NULL);
 #endif
 
-       /* Block the following signals (SIGINT for <ctrl>-c, SIGQUIT for
-          <ctrl>-\).  We enable them later in signal_thread, but only for
-          this thread. */
-
-       sigemptyset(&mask);
-       sigaddset(&mask, SIGINT);
-#if !defined(__FREEBSD__)
-       sigaddset(&mask, SIGQUIT);
-#endif
-       sigprocmask(SIG_BLOCK, &mask, NULL);
-
 #endif /* !defined(__CYGWIN__) */
 }
 
@@ -183,7 +200,9 @@ static void signal_thread(void)
        sigset_t mask;
        int      sig;
 
-       sigemptyset(&mask);
+       if (sigemptyset(&mask) != 0)
+               vm_abort("signal_thread: sigemptyset failed: %s", strerror(errno));
+
        sigaddset(&mask, SIGINT);
 #if !defined(__FREEBSD__)
        sigaddset(&mask, SIGQUIT);
@@ -192,7 +211,7 @@ static void signal_thread(void)
        while (true) {
                /* just wait for a signal */
 
-               sigwait(&mask, &sig);
+               (void) sigwait(&mask, &sig);
 
                switch (sig) {
                case SIGINT:
@@ -203,8 +222,9 @@ static void signal_thread(void)
 
                case SIGQUIT:
                        /* print a thread dump */
-
+#if defined(ENABLE_THREADS)
                        threads_dump();
+#endif
 
 #if defined(ENABLE_STATISTICS)
                        if (opt_stat)
@@ -229,34 +249,16 @@ static void signal_thread(void)
 bool signal_start_thread(void)
 {
 #if defined(ENABLE_THREADS)
-#if defined(WITH_CLASSPATH_GNU)
-       java_lang_VMThread *vmt;
-#endif
+       utf *name;
 
-       /* create the finalizer object */
+       name = utf_new_char("Signal Handler");
 
-       thread_signal = (threadobject *) builtin_new(class_java_lang_Thread);
+       thread_signal = threads_create_thread(name);
 
        if (thread_signal == NULL)
                return false;
 
-#if defined(WITH_CLASSPATH_GNU)
-       vmt = (java_lang_VMThread *) builtin_new(class_java_lang_VMThread);
-
-       vmt->thread = (java_lang_Thread *) thread_signal;
-
-       thread_signal->o.vmThread = vmt;
-#endif
-
-       thread_signal->flags      = THREAD_FLAG_DAEMON;
-
-       thread_signal->o.name     = javastring_new_from_ascii("Signal Handler");
-#if defined(ENABLE_JAVASE)
-       thread_signal->o.daemon   = true;
-#endif
-       thread_signal->o.priority = 5;
-
-       /* actually start the finalizer thread */
+       /* actually start the signal handler thread */
 
        threads_start_thread(thread_signal, signal_thread);
 
@@ -264,7 +266,7 @@ bool signal_start_thread(void)
 
        return true;
 #else
-#error FIX ME!
+#warning FIX ME!
 #endif
 }