Skip to content

Commit

Permalink
Showing 2 changed files with 17 additions and 32 deletions.
33 changes: 13 additions & 20 deletions truffle/src/main/java/org/jruby/truffle/runtime/signal/Signal.java
Original file line number Diff line number Diff line change
@@ -15,22 +15,24 @@
@SuppressWarnings("restriction")
public class Signal {

private final sun.misc.Signal signal;
private final sun.misc.Signal sunSignal;

private static final ConcurrentMap<sun.misc.SignalHandler, SignalHandler> SUN2OUR_HANDLERS = new ConcurrentHashMap<sun.misc.SignalHandler, SignalHandler>();
private static final ConcurrentMap<sun.misc.Signal, sun.misc.SignalHandler> DEFAULT_HANDLERS = new ConcurrentHashMap<sun.misc.Signal, sun.misc.SignalHandler>();

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

public static SignalHandler handle(final Signal signal, final SignalHandler newHandler) {
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);
public static void handle(final Signal signal, final SignalHandler newHandler) {
final sun.misc.SignalHandler oldSunHandler = sun.misc.Signal.handle(signal.sunSignal, wrapHandler(signal, newHandler));
DEFAULT_HANDLERS.putIfAbsent(signal.sunSignal, oldSunHandler);
}

final SignalHandler oldHandler = SUN2OUR_HANDLERS.putIfAbsent(oldWrappedHandler, unwrapHandler(oldWrappedHandler));
return oldHandler;
public static void handleDefault(final Signal signal) {
final sun.misc.SignalHandler defaultHandler = DEFAULT_HANDLERS.get(signal);
if (defaultHandler != null) { // otherwise it is already the default signal
sun.misc.Signal.handle(signal.sunSignal, defaultHandler);
}
}

private static sun.misc.SignalHandler wrapHandler(final Signal signal, final SignalHandler newHandler) {
@@ -42,17 +44,8 @@ public void handle(sun.misc.Signal wrappedSignal) {
};
}

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

public static void raise(Signal signal) {
sun.misc.Signal.raise(signal.signal);
sun.misc.Signal.raise(signal.sunSignal);
}

}
Original file line number Diff line number Diff line change
@@ -9,16 +9,12 @@
*/
package org.jruby.truffle.runtime.signal;

import org.jruby.RubySignal;

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

public class SignalOperations {
import org.jruby.RubySignal;

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

public static final Map<String, Integer> SIGNALS_LIST = Collections.unmodifiableMap(RubySignal.list());

@@ -30,15 +26,11 @@ public void handle(Signal arg0) {
};

public static void watchSignal(Signal signal, SignalHandler newHandler) {
SignalHandler oldHandler = Signal.handle(signal, newHandler);
ORIGINAL_HANDLERS.putIfAbsent(signal, oldHandler);
Signal.handle(signal, newHandler);
}

public static void watchDefaultForSignal(Signal signal) {
SignalHandler defaultHandler = ORIGINAL_HANDLERS.get(signal);
if (defaultHandler != null) {
Signal.handle(signal, defaultHandler);
}
Signal.handleDefault(signal);
}

public static void raise(Signal signal) {

0 comments on commit c9712e8

Please sign in to comment.