Skip to content

Commit

Permalink
Showing 5 changed files with 21 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -25,7 +25,6 @@
import org.jruby.truffle.runtime.signal.Signal;
import org.jruby.truffle.runtime.signal.SignalOperations;

@SuppressWarnings("restriction")
@CoreClass(name = "Process")
public abstract class ProcessNodes {

Original file line number Diff line number Diff line change
@@ -382,7 +382,6 @@ public DynamicObject times() {

}

@SuppressWarnings("restriction")
@RubiniusPrimitive(name = "vm_watch_signal", needsSelf = false)
public static abstract class VMWatchSignalPrimitiveNode extends RubiniusPrimitiveNode {

@@ -397,23 +396,20 @@ public boolean watchSignal(DynamicObject signalName, DynamicObject action) {
}

Signal signal = new Signal(signalName.toString());

SignalOperations.watchDefaultForSignal(signal);
return true;
}

@Specialization(guards = {"isRubyString(signalName)", "isNil(nil)"})
public boolean watchSignal(DynamicObject signalName, Object nil) {
Signal signal = new Signal(signalName.toString());

SignalOperations.watchSignal(signal, SignalOperations.IGNORE_HANDLER);
return true;
}

@Specialization(guards = {"isRubyString(signalName)", "isRubyProc(proc)"})
public boolean watchSignalProc(DynamicObject signalName, DynamicObject proc) {
Signal signal = new Signal(signalName.toString());

SignalOperations.watchSignal(signal, new ProcSignalHandler(getContext(), proc));
return true;
}
Original file line number Diff line number Diff line change
@@ -17,7 +17,6 @@
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.subsystems.SafepointAction;

@SuppressWarnings("restriction")
public class ProcSignalHandler implements SignalHandler {

private final RubyContext context;
45 changes: 21 additions & 24 deletions truffle/src/main/java/org/jruby/truffle/runtime/signal/Signal.java
Original file line number Diff line number Diff line change
@@ -9,49 +9,46 @@
*/
package org.jruby.truffle.runtime.signal;

import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

@SuppressWarnings("restriction")
public class Signal {

private final sun.misc.Signal signal;

private final static Map<sun.misc.SignalHandler, SignalHandler> handlers = new WeakHashMap<>();
private static final ConcurrentMap<sun.misc.SignalHandler, SignalHandler> SUN2OUR_HANDLERS = new ConcurrentHashMap<sun.misc.SignalHandler, SignalHandler>();

public Signal(String name) {
signal = new sun.misc.Signal(name);
}

public static SignalHandler handle(final Signal signal, final SignalHandler newHandler) {
final sun.misc.SignalHandler wrappedNewHandler = new sun.misc.SignalHandler() {
final sun.misc.SignalHandler wrappedNewHandler = wrapHandler(signal, newHandler);
SUN2OUR_HANDLERS.put(wrappedNewHandler, newHandler);

final sun.misc.SignalHandler oldWrappedHandler = sun.misc.Signal.handle(signal.signal, wrappedNewHandler);

final SignalHandler oldHandler = SUN2OUR_HANDLERS.putIfAbsent(oldWrappedHandler, unwrapHandler(oldWrappedHandler));
return oldHandler;
}

private static sun.misc.SignalHandler wrapHandler(final Signal signal, final SignalHandler newHandler) {
return new sun.misc.SignalHandler() {
@Override
public void handle(sun.misc.Signal wrappedSignal) {
newHandler.handle(signal);
}

};
}

synchronized (handlers) {
handlers.put(wrappedNewHandler, newHandler);

final sun.misc.SignalHandler oldWrappedHandler = sun.misc.Signal.handle(signal.signal, wrappedNewHandler);

SignalHandler oldHandler = handlers.get(oldWrappedHandler);

if (oldHandler == null) {
oldHandler = new SignalHandler() {
@Override
public void handle(Signal signal) {
oldWrappedHandler.handle(signal.signal);
}
};

handlers.put(oldWrappedHandler, oldHandler);
private static SignalHandler unwrapHandler(final sun.misc.SignalHandler oldWrappedHandler) {
return new SignalHandler() {
@Override
public void handle(Signal signal) {
oldWrappedHandler.handle(signal.signal);
}

return oldHandler;
}
};
}

public static void raise(Signal signal) {
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

@SuppressWarnings("restriction")
public class SignalOperations {

private static final ConcurrentMap<Signal, SignalHandler> ORIGINAL_HANDLERS = new ConcurrentHashMap<Signal, SignalHandler>();

0 comments on commit d2357f3

Please sign in to comment.