Skip to content

Commit 7129f06

Browse files
committed
Pass :IGNORE as a String too to :vm_watch_signal for consistency
* Simplifies logic a bit.
1 parent e7f01c1 commit 7129f06

File tree

3 files changed

+35
-20
lines changed

3 files changed

+35
-20
lines changed

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -280,21 +280,21 @@ public static abstract class VMWatchSignalPrimitiveNode extends PrimitiveArrayAr
280280
@Specialization(guards = { "isRubyString(signalName)", "isRubyString(action)" })
281281
public boolean restoreDefault(DynamicObject signalName, DynamicObject action) {
282282
final String actionString = StringOperations.getString(action);
283+
final String signal = StringOperations.getString(signalName);
284+
283285
switch (actionString) {
284286
case "DEFAULT":
285-
return restoreDefaultHandler(StringOperations.getString(signalName));
287+
return restoreDefaultHandler(signal);
286288
case "SYSTEM_DEFAULT":
287-
return restoreSystemHandler(StringOperations.getString(signalName));
289+
return restoreSystemHandler(signal);
290+
case "IGNORE":
291+
return registerIgnoreHandler(signal);
288292
default:
289293
throw new UnsupportedOperationException(actionString);
290294
}
291295
}
292296

293-
@Specialization(guards = { "isRubyString(signalName)", "isNil(nil)" })
294-
public boolean ignoreSignal(DynamicObject signalName, Object nil) {
295-
return registerHandler(StringOperations.getString(signalName), null);
296-
}
297-
297+
@TruffleBoundary
298298
@Specialization(guards = { "isRubyString(signalNameString)", "isRubyProc(proc)" })
299299
public boolean watchSignalProc(DynamicObject signalNameString, DynamicObject proc) {
300300
if (getContext().getThreadManager().getCurrentThread() != getContext().getThreadManager().getRootThread()) {
@@ -358,6 +358,20 @@ private boolean restoreSystemHandler(String signalName) {
358358
return true;
359359
}
360360

361+
@TruffleBoundary
362+
private boolean registerIgnoreHandler(String signalName) {
363+
if (getContext().getOptions().EMBEDDED) {
364+
RubyLanguage.LOGGER.warning("ignoring signal " + signalName + " in embedded mode may interfere with other embedded contexts or the host system");
365+
}
366+
367+
try {
368+
Signals.registerIgnoreHandler(signalName);
369+
} catch (IllegalArgumentException e) {
370+
throw new RaiseException(getContext(), coreExceptions().argumentError(e.getMessage(), this));
371+
}
372+
return true;
373+
}
374+
361375
@TruffleBoundary
362376
private boolean registerHandler(String signalName, Runnable newHandler) {
363377
if (getContext().getOptions().EMBEDDED) {

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,27 @@
1313
import java.util.concurrent.ConcurrentMap;
1414

1515
import sun.misc.Signal;
16+
import sun.misc.SignalHandler;
1617

1718
public class Signals {
1819

1920
// Use String and not Signal as key to work around SVM not allowing new Signal("PROF")
20-
private static final ConcurrentMap<String, sun.misc.SignalHandler> DEFAULT_HANDLERS = new ConcurrentHashMap<>();
21+
private static final ConcurrentMap<String, SignalHandler> DEFAULT_HANDLERS = new ConcurrentHashMap<>();
2122

2223
public static void registerHandler(Runnable newHandler, String signalName) {
2324
final Signal signal = new Signal(signalName);
24-
final sun.misc.SignalHandler oldSunHandler;
25-
if (newHandler == null) {
26-
oldSunHandler = Signal.handle(signal, sun.misc.SignalHandler.SIG_IGN);
27-
} else {
28-
oldSunHandler = Signal.handle(signal, s -> newHandler.run());
29-
}
30-
DEFAULT_HANDLERS.putIfAbsent(signalName, oldSunHandler);
25+
final SignalHandler oldHandler = Signal.handle(signal, s -> newHandler.run());
26+
DEFAULT_HANDLERS.putIfAbsent(signalName, oldHandler);
27+
}
28+
29+
public static void registerIgnoreHandler(String signalName) {
30+
final Signal signal = new Signal(signalName);
31+
final SignalHandler oldHandler = Signal.handle(signal, SignalHandler.SIG_IGN);
32+
DEFAULT_HANDLERS.putIfAbsent(signalName, oldHandler);
3133
}
3234

3335
public static boolean restoreDefaultHandler(String signalName) {
34-
final sun.misc.SignalHandler defaultHandler = Signals.DEFAULT_HANDLERS.get(signalName);
36+
final SignalHandler defaultHandler = Signals.DEFAULT_HANDLERS.get(signalName);
3537
if (defaultHandler == null) {
3638
// it is already the default signal
3739
return false;
@@ -44,7 +46,7 @@ public static boolean restoreDefaultHandler(String signalName) {
4446

4547
public static void restoreSystemHandler(String signalName) {
4648
final Signal signal = new Signal(signalName);
47-
Signal.handle(signal, sun.misc.SignalHandler.SIG_DFL);
49+
Signal.handle(signal, SignalHandler.SIG_DFL);
4850
}
4951

5052
}

src/main/ruby/truffleruby/core/signal.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def self.trap(signal, handler=nil, &block)
9292
handler = 'SYSTEM_DEFAULT'
9393
when 'IGNORE', 'SIG_IGN'
9494
handler = 'IGNORE'
95-
when nil
95+
when nil # Same as 'IGNORE', except that it is kept as null in @handlers
9696
handler = nil
9797
when 'EXIT'
9898
handler = proc { exit }
@@ -114,8 +114,7 @@ def self.trap(signal, handler=nil, &block)
114114
end
115115

116116
if number != Names['EXIT']
117-
handler = handler == 'IGNORE' ? nil : handler
118-
ret = Truffle.invoke_primitive :vm_watch_signal, signame, handler
117+
ret = Truffle.invoke_primitive(:vm_watch_signal, signame, handler || 'IGNORE')
119118
if handler == 'DEFAULT' && !ret
120119
return +'SYSTEM_DEFAULT'
121120
end

0 commit comments

Comments
 (0)