Skip to content

Commit 9f8e3fd

Browse files
committed
Save default signal handlers instead of exposing them
1 parent 62d2d01 commit 9f8e3fd

File tree

3 files changed

+15
-105
lines changed

3 files changed

+15
-105
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import com.oracle.graal.python.builtins.objects.ints.PInt;
5353
import com.oracle.graal.python.builtins.objects.module.PythonModule;
5454
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
55-
import com.oracle.graal.python.builtins.objects.signal.PJavaSignalHandler;
5655
import com.oracle.graal.python.nodes.ErrorMessages;
5756
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
5857
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
@@ -63,7 +62,6 @@
6362
import com.oracle.graal.python.runtime.AsyncHandler;
6463
import com.oracle.graal.python.runtime.PythonCore;
6564
import com.oracle.graal.python.runtime.exception.PythonErrorType;
66-
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
6765
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
6866
import com.oracle.truffle.api.dsl.Cached;
6967
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -77,7 +75,8 @@
7775

7876
@CoreFunctions(defineModule = "_signal")
7977
public class SignalModuleBuiltins extends PythonBuiltins {
80-
private static ConcurrentHashMap<Integer, Object> signalHandlers = new ConcurrentHashMap<>();
78+
private static final ConcurrentHashMap<Integer, Object> signalHandlers = new ConcurrentHashMap<>();
79+
private static final ConcurrentHashMap<Integer, SignalHandler> defaultSignalHandlers = new ConcurrentHashMap<>();
8180

8281
private static final HiddenKey signalQueueKey = new HiddenKey("signalQueue");
8382
private final ConcurrentLinkedDeque<SignalTriggerAction> signalQueue = new ConcurrentLinkedDeque<>();
@@ -177,15 +176,17 @@ int alarmOvf(PInt seconds) {
177176
}
178177

179178
@TruffleBoundary
180-
private static Object handlerToPython(PythonObjectFactory factory, SignalHandler handler, int signum) {
179+
private static Object handlerToPython(SignalHandler handler, int signum) {
181180
if (handler == sun.misc.SignalHandler.SIG_DFL) {
182181
return Signals.SIG_DFL;
183182
} else if (handler == sun.misc.SignalHandler.SIG_IGN) {
184183
return Signals.SIG_IGN;
185184
} else if (handler instanceof Signals.PythonSignalHandler) {
186185
return signalHandlers.getOrDefault(signum, PNone.NONE);
187186
} else {
188-
return factory.createJavaSignalHandler(handler);
187+
// Save default JVM handlers to be restored later
188+
defaultSignalHandlers.put(signum, handler);
189+
return Signals.SIG_DFL;
189190
}
190191
}
191192

@@ -195,7 +196,7 @@ abstract static class GetSignalNode extends PythonUnaryBuiltinNode {
195196
@Specialization
196197
@TruffleBoundary
197198
Object getsignal(int signum) {
198-
return handlerToPython(factory(), Signals.getCurrentSignalHandler(signum), signum);
199+
return handlerToPython(Signals.getCurrentSignalHandler(signum), signum);
199200
}
200201

201202
@Specialization(limit = "3")
@@ -219,7 +220,7 @@ Object defaultIntHandler(@SuppressWarnings("unused") Object[] args) {
219220
@GenerateNodeFactory
220221
abstract static class SignalNode extends PythonTernaryBuiltinNode {
221222

222-
@Specialization(guards = {"!idNumLib.isCallable(idNum)", "!isJavaHandler(idNum)"}, limit = "1")
223+
@Specialization(guards = "!idNumLib.isCallable(idNum)", limit = "1")
223224
Object signalId(@SuppressWarnings("unused") PythonModule self, Object signal, Object idNum,
224225
@SuppressWarnings("unused") @CachedLibrary("idNum") PythonObjectLibrary idNumLib,
225226
@CachedLibrary("signal") PythonObjectLibrary signalLib) {
@@ -234,31 +235,15 @@ Object signalId(@SuppressWarnings("unused") PythonModule self, Object signal, Ob
234235
private Object signal(int signum, int id) {
235236
SignalHandler oldHandler;
236237
try {
237-
oldHandler = Signals.setSignalHandler(signum, id);
238+
if (id == Signals.SIG_DFL && defaultSignalHandlers.containsKey(signum)) {
239+
oldHandler = Signals.setSignalHandler(signum, defaultSignalHandlers.get(signum));
240+
} else {
241+
oldHandler = Signals.setSignalHandler(signum, id);
242+
}
238243
} catch (IllegalArgumentException e) {
239244
throw raise(PythonErrorType.TypeError, ErrorMessages.SIGNAL_MUST_BE_SIGIGN_SIGDFL_OR_CALLABLE_OBJ);
240245
}
241-
Object result = handlerToPython(factory(), oldHandler, signum);
242-
signalHandlers.remove(signum);
243-
return result;
244-
}
245-
246-
@Specialization(limit = "1")
247-
Object signalHandler(@SuppressWarnings("unused") PythonModule self, Object signal, PJavaSignalHandler handler,
248-
@CachedLibrary("signal") PythonObjectLibrary signalLib) {
249-
int signum = signalLib.asSize(signal);
250-
return signal(signum, handler);
251-
}
252-
253-
@TruffleBoundary
254-
private Object signal(int signum, PJavaSignalHandler handler) {
255-
SignalHandler oldHandler;
256-
try {
257-
oldHandler = Signals.setSignalHandler(signum, handler.getHandler());
258-
} catch (IllegalArgumentException e) {
259-
throw raise(PythonErrorType.ValueError, e);
260-
}
261-
Object result = handlerToPython(factory(), oldHandler, signum);
246+
Object result = handlerToPython(oldHandler, signum);
262247
signalHandlers.remove(signum);
263248
return result;
264249
}
@@ -286,7 +271,7 @@ private Object signal(PythonModule self, int signum, Object handler, ReadAttribu
286271
} catch (IllegalArgumentException e) {
287272
throw raise(PythonErrorType.ValueError, e);
288273
}
289-
Object result = handlerToPython(factory(), oldHandler, signum);
274+
Object result = handlerToPython(oldHandler, signum);
290275
signalHandlers.put(signum, handler);
291276
return result;
292277
}
@@ -310,10 +295,6 @@ private static Semaphore getSemaphore(PythonModule self, ReadAttributeFromObject
310295
throw new IllegalStateException("the signal trigger semaphore was modified!");
311296
}
312297
}
313-
314-
protected static boolean isJavaHandler(Object obj) {
315-
return obj instanceof PJavaSignalHandler;
316-
}
317298
}
318299
}
319300

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/signal/PJavaSignalHandler.java

Lines changed: 0 additions & 59 deletions
This file was deleted.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/object/PythonObjectFactory.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@
108108
import com.oracle.graal.python.builtins.objects.set.PBaseSet;
109109
import com.oracle.graal.python.builtins.objects.set.PFrozenSet;
110110
import com.oracle.graal.python.builtins.objects.set.PSet;
111-
import com.oracle.graal.python.builtins.objects.signal.PJavaSignalHandler;
112111
import com.oracle.graal.python.builtins.objects.slice.PIntSlice;
113112
import com.oracle.graal.python.builtins.objects.slice.PObjectSlice;
114113
import com.oracle.graal.python.builtins.objects.socket.PSocket;
@@ -156,8 +155,6 @@
156155
import com.oracle.truffle.api.object.DynamicObject;
157156
import com.oracle.truffle.api.object.Shape;
158157

159-
import sun.misc.SignalHandler;
160-
161158
@GenerateUncached
162159
@ImportStatic(PythonOptions.class)
163160
@ReportPolymorphism
@@ -861,15 +858,6 @@ public PSocket createSocket(Object cls, int family, int type, int proto, int fil
861858
return trace(new PSocket(cls, getShape(cls), family, type, proto, fileno));
862859
}
863860

864-
/*
865-
* Signal
866-
*/
867-
868-
public PJavaSignalHandler createJavaSignalHandler(SignalHandler handler) {
869-
PythonBuiltinClassType cls = PythonBuiltinClassType.PJavaSignalHandler;
870-
return trace(new PJavaSignalHandler(cls, getShape(cls), handler));
871-
}
872-
873861
/*
874862
* Threading
875863
*/

0 commit comments

Comments
 (0)