Skip to content

Commit 732fe2e

Browse files
committed
Create SignalHandler directly instead of converting from Runnable
* Makes it easier to debug signal handling.
1 parent dbfae4a commit 732fe2e

File tree

2 files changed

+14
-13
lines changed

2 files changed

+14
-13
lines changed

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import com.oracle.truffle.api.profiles.ConditionProfile;
9191

9292
import sun.misc.Signal;
93+
import sun.misc.SignalHandler;
9394

9495
@CoreModule(value = "VMPrimitives", isClass = true)
9596
public abstract class VMPrimitiveNodes {
@@ -229,34 +230,34 @@ public static abstract class VMWatchSignalNode extends PrimitiveArrayArgumentsNo
229230

230231
@TruffleBoundary
231232
@Specialization
232-
protected boolean restoreDefault(RubyString signalName, RubyString action) {
233+
protected boolean restoreDefault(RubyString signalString, RubyString action) {
233234
final String actionString = StringOperations.getString(action);
234-
final String signal = StringOperations.getString(signalName);
235+
final String signalName = StringOperations.getString(signalString);
235236

236237
switch (actionString) {
237238
case "DEFAULT":
238-
return restoreDefaultHandler(signal);
239+
return restoreDefaultHandler(signalName);
239240
case "SYSTEM_DEFAULT":
240-
return restoreSystemHandler(signal);
241+
return restoreSystemHandler(signalName);
241242
case "IGNORE":
242-
return registerIgnoreHandler(signal);
243+
return registerIgnoreHandler(signalName);
243244
default:
244245
throw new UnsupportedOperationException(actionString);
245246
}
246247
}
247248

248249
@TruffleBoundary
249250
@Specialization
250-
protected boolean watchSignalProc(RubyString signalName, RubyProc action) {
251+
protected boolean watchSignalProc(RubyString signalString, RubyProc action) {
251252
if (getContext().getThreadManager().getCurrentThread() != getContext().getThreadManager().getRootThread()) {
252253
// The proc will be executed on the main thread
253254
SharedObjects.writeBarrier(getContext(), action);
254255
}
255256

256257
final RubyContext context = getContext();
257258

258-
final String signal = StringOperations.getString(signalName);
259-
return registerHandler(signal, () -> {
259+
String signalName = StringOperations.getString(signalString);
260+
return registerHandler(signalName, signal -> {
260261
if (context.getOptions().SINGLE_THREADED) {
261262
RubyLanguage.LOGGER.severe(
262263
"signal " + signal + " caught but can't create a thread to handle it so ignoring");
@@ -279,9 +280,9 @@ protected boolean watchSignalProc(RubyString signalName, RubyProc action) {
279280
printStream.println(
280281
"[ruby] SEVERE: signal " + signal +
281282
" caught but can't attach a thread to handle it so restoring the default handler and re-raising the signal");
282-
Signals.restoreDefaultHandler(signal);
283+
Signals.restoreDefaultHandler(signalName);
283284
try {
284-
Signal.raise(new Signal(signal));
285+
Signal.raise(signal);
285286
} catch (IllegalArgumentException illegalArgumentException) {
286287
illegalArgumentException.printStackTrace(printStream);
287288
}
@@ -351,7 +352,7 @@ private boolean registerIgnoreHandler(String signalName) {
351352
}
352353

353354
@TruffleBoundary
354-
private boolean registerHandler(String signalName, Runnable newHandler) {
355+
private boolean registerHandler(String signalName, SignalHandler newHandler) {
355356
if (getContext().getOptions().EMBEDDED) {
356357
RubyLanguage.LOGGER.warning(
357358
"trapping signal " + signalName +

src/main/java/org/truffleruby/platform/Signals.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ public class Signals {
2020
// Use String and not Signal as key to work around SVM not allowing new Signal("PROF")
2121
private static final ConcurrentMap<String, SignalHandler> DEFAULT_HANDLERS = new ConcurrentHashMap<>();
2222

23-
public static void registerHandler(Runnable newHandler, String signalName) {
23+
public static void registerHandler(SignalHandler newHandler, String signalName) {
2424
final Signal signal = new Signal(signalName);
25-
final SignalHandler oldHandler = Signal.handle(signal, s -> newHandler.run());
25+
final SignalHandler oldHandler = Signal.handle(signal, newHandler);
2626
DEFAULT_HANDLERS.putIfAbsent(signalName, oldHandler);
2727
}
2828

0 commit comments

Comments
 (0)