Skip to content

Commit e7f01c1

Browse files
committed
Handle Process.kill on the current PID correctly if no handler is registered
1 parent 127e6e7 commit e7f01c1

File tree

3 files changed

+7
-4
lines changed

3 files changed

+7
-4
lines changed

spec/tags/core/signal/trap_tags.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,3 @@ slow:Signal.trap the special EXIT signal code can unset the handler
66
slow:Signal.trap returns 'DEFAULT' for the initial SIGINT handler
77
slow:Signal.trap accepts 'SYSTEM_DEFAULT' and uses the OS handler for SIGPIPE
88
slow:Signal.trap allows to register a handler for all known signals, except reserved signals for which it raises ArgumentError
9-
fails:Signal.trap registers an handler doing nothing with :IGNORE

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import org.truffleruby.builtins.CoreClass;
1818
import org.truffleruby.builtins.Primitive;
1919
import org.truffleruby.builtins.PrimitiveArrayArgumentsNode;
20-
import org.truffleruby.language.control.RaiseException;
2120
import sun.misc.Signal;
2221

2322
@CoreClass("Process")
@@ -54,7 +53,8 @@ public int raise(DynamicObject signalName) {
5453
try {
5554
Signal.raise(signal);
5655
} catch (IllegalArgumentException e) {
57-
throw new RaiseException(getContext(), coreExceptions().argumentError(e.getMessage(), this));
56+
// Java does not know the handler, fallback to using kill()
57+
return -1;
5858
}
5959
return 1;
6060
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,11 @@ def self.kill(signal, *pids)
376376

377377
if pid == Process.pid && signal != 0
378378
signal_name = Signal::Numbers[signal].to_sym
379-
Truffle.invoke_primitive :process_kill_raise, signal_name
379+
result = Truffle.invoke_primitive :process_kill_raise, signal_name
380+
if result == -1 # Try kill() if the java Signal.raise() failed
381+
result = Truffle::POSIX.kill(pid, signal)
382+
Errno.handle if result == -1
383+
end
380384
else
381385
pid = -pid if use_process_group
382386
result = Truffle::POSIX.kill(pid, signal)

0 commit comments

Comments
 (0)