aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/lang')
-rw-r--r--libjava/java/lang/natPosixProcess.cc19
1 files changed, 8 insertions, 11 deletions
diff --git a/libjava/java/lang/natPosixProcess.cc b/libjava/java/lang/natPosixProcess.cc
index a4b87c3..cca768b6 100644
--- a/libjava/java/lang/natPosixProcess.cc
+++ b/libjava/java/lang/natPosixProcess.cc
@@ -126,26 +126,23 @@ error:
void
java::lang::ConcreteProcess$ProcessManager::waitForSignal ()
{
- using namespace java::lang;
-
- sigset_t mask;
// Wait for SIGCHLD
+ sigset_t mask;
pthread_sigmask (0, NULL, &mask);
sigdelset (&mask, SIGCHLD);
+
// Use sigsuspend() instead of sigwait() as sigwait() doesn't play
// nicely with the GC's use of signals.
- int c = sigsuspend (&mask);
+ sigsuspend (&mask);
- if (c != -1)
- goto error;
- if (errno != EINTR)
- goto error;
+ // Do not check sigsuspend return value. The only legitimate return
+ // is EINTR, but there is a known kernel bug affecting alpha-linux
+ // wrt sigsuspend+handler+sigreturn that can result in a return value
+ // of __NR_sigsuspend and errno unset. Don't fail unnecessarily on
+ // older kernel versions.
// All OK.
return;
-
-error:
- throw new InternalError (JvNewStringUTF (strerror (errno)));
}
jboolean java::lang::ConcreteProcess$ProcessManager::reap ()