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"
{
#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. */
(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. */
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
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__) */
}
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);
while (true) {
/* just wait for a signal */
- sigwait(&mask, &sig);
+ (void) sigwait(&mask, &sig);
switch (sig) {
case SIGINT:
case SIGQUIT:
/* print a thread dump */
-
+#if defined(ENABLE_THREADS)
threads_dump();
+#endif
#if defined(ENABLE_STATISTICS)
if (opt_stat)
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);
return true;
#else
-#error FIX ME!
+#warning FIX ME!
#endif
}