* src/vm/signal.c (signal_thread): Restart sigwait if it has been
authorChristian Thalinger <twisti@complang.tuwien.ac.at>
Fri, 1 Aug 2008 11:05:05 +0000 (13:05 +0200)
committerChristian Thalinger <twisti@complang.tuwien.ac.at>
Fri, 1 Aug 2008 11:05:05 +0000 (13:05 +0200)
interrupted. This currently only works for Linux.

src/vm/signal.c

index 402d4706a646471526a94479778a6720a9e94a4b..0efc5c6138cdfe17e70170b976d24d472d6e411e 100644 (file)
@@ -252,6 +252,7 @@ static void signal_thread(void)
        threadobject *t;
        sigset_t      mask;
        int           sig;
+       int result;
 
        t = THREADOBJECT;
 
@@ -277,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);
@@ -332,8 +333,9 @@ void signal_thread_handler(int sig)
                (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: Java signal handler throw an exception. Exiting...");
+                       vm_abort("signal_thread_handler: Aborting...");
                }
                break;
        }