Skip to content

Commit caf3d26

Browse files
committed
Better error message when the Signal thread fails to enter()
1 parent da6a94c commit caf3d26

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

src/main/java/org/truffleruby/core/VMPrimitiveNodes.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
import org.truffleruby.language.yield.YieldNode;
7777
import org.truffleruby.platform.Signals;
7878

79+
import java.io.PrintStream;
7980
import java.util.Map.Entry;
8081

8182
@CoreClass(value = "VM primitives")
@@ -317,7 +318,16 @@ public boolean watchSignalProc(DynamicObject signalNameString, DynamicObject pro
317318
// Workaround: we need to register with Truffle (which means going multithreaded),
318319
// so that NFI can get its context to call pthread_kill() (GR-7405).
319320
final TruffleContext truffleContext = context.getEnv().getContext();
320-
final Object prev = truffleContext.enter();
321+
final Object prev;
322+
try {
323+
prev = truffleContext.enter();
324+
} catch (IllegalStateException e) { // Multi threaded access denied from Truffle
325+
// Not in a context, so we cannot use TruffleLogger
326+
final PrintStream printStream = new PrintStream(context.getEnv().err(), true);
327+
printStream.println("[ruby] SEVERE: signal " + signalName + " caught but can't create a thread to handle it so ignoring and restoring the default handler");
328+
Signals.restoreDefaultHandler(signalName);
329+
return;
330+
}
321331
try {
322332
context.getSafepointManager().pauseAllThreadsAndExecuteFromNonRubyThread(true, (rubyThread, currentNode) -> {
323333
if (rubyThread == rootThread &&

0 commit comments

Comments
 (0)