52
52
import com .oracle .graal .python .builtins .objects .ints .PInt ;
53
53
import com .oracle .graal .python .builtins .objects .module .PythonModule ;
54
54
import com .oracle .graal .python .builtins .objects .object .PythonObjectLibrary ;
55
- import com .oracle .graal .python .builtins .objects .signal .PJavaSignalHandler ;
56
55
import com .oracle .graal .python .nodes .ErrorMessages ;
57
56
import com .oracle .graal .python .nodes .attributes .ReadAttributeFromObjectNode ;
58
57
import com .oracle .graal .python .nodes .function .PythonBuiltinBaseNode ;
63
62
import com .oracle .graal .python .runtime .AsyncHandler ;
64
63
import com .oracle .graal .python .runtime .PythonCore ;
65
64
import com .oracle .graal .python .runtime .exception .PythonErrorType ;
66
- import com .oracle .graal .python .runtime .object .PythonObjectFactory ;
67
65
import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
68
66
import com .oracle .truffle .api .dsl .Cached ;
69
67
import com .oracle .truffle .api .dsl .GenerateNodeFactory ;
77
75
78
76
@ CoreFunctions (defineModule = "_signal" )
79
77
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 <>();
81
80
82
81
private static final HiddenKey signalQueueKey = new HiddenKey ("signalQueue" );
83
82
private final ConcurrentLinkedDeque <SignalTriggerAction > signalQueue = new ConcurrentLinkedDeque <>();
@@ -177,15 +176,17 @@ int alarmOvf(PInt seconds) {
177
176
}
178
177
179
178
@ TruffleBoundary
180
- private static Object handlerToPython (PythonObjectFactory factory , SignalHandler handler , int signum ) {
179
+ private static Object handlerToPython (SignalHandler handler , int signum ) {
181
180
if (handler == sun .misc .SignalHandler .SIG_DFL ) {
182
181
return Signals .SIG_DFL ;
183
182
} else if (handler == sun .misc .SignalHandler .SIG_IGN ) {
184
183
return Signals .SIG_IGN ;
185
184
} else if (handler instanceof Signals .PythonSignalHandler ) {
186
185
return signalHandlers .getOrDefault (signum , PNone .NONE );
187
186
} 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 ;
189
190
}
190
191
}
191
192
@@ -195,7 +196,7 @@ abstract static class GetSignalNode extends PythonUnaryBuiltinNode {
195
196
@ Specialization
196
197
@ TruffleBoundary
197
198
Object getsignal (int signum ) {
198
- return handlerToPython (factory (), Signals .getCurrentSignalHandler (signum ), signum );
199
+ return handlerToPython (Signals .getCurrentSignalHandler (signum ), signum );
199
200
}
200
201
201
202
@ Specialization (limit = "3" )
@@ -219,7 +220,7 @@ Object defaultIntHandler(@SuppressWarnings("unused") Object[] args) {
219
220
@ GenerateNodeFactory
220
221
abstract static class SignalNode extends PythonTernaryBuiltinNode {
221
222
222
- @ Specialization (guards = { "!idNumLib.isCallable(idNum)" , "!isJavaHandler(idNum)" } , limit = "1" )
223
+ @ Specialization (guards = "!idNumLib.isCallable(idNum)" , limit = "1" )
223
224
Object signalId (@ SuppressWarnings ("unused" ) PythonModule self , Object signal , Object idNum ,
224
225
@ SuppressWarnings ("unused" ) @ CachedLibrary ("idNum" ) PythonObjectLibrary idNumLib ,
225
226
@ CachedLibrary ("signal" ) PythonObjectLibrary signalLib ) {
@@ -234,31 +235,15 @@ Object signalId(@SuppressWarnings("unused") PythonModule self, Object signal, Ob
234
235
private Object signal (int signum , int id ) {
235
236
SignalHandler oldHandler ;
236
237
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
+ }
238
243
} catch (IllegalArgumentException e ) {
239
244
throw raise (PythonErrorType .TypeError , ErrorMessages .SIGNAL_MUST_BE_SIGIGN_SIGDFL_OR_CALLABLE_OBJ );
240
245
}
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 );
262
247
signalHandlers .remove (signum );
263
248
return result ;
264
249
}
@@ -286,7 +271,7 @@ private Object signal(PythonModule self, int signum, Object handler, ReadAttribu
286
271
} catch (IllegalArgumentException e ) {
287
272
throw raise (PythonErrorType .ValueError , e );
288
273
}
289
- Object result = handlerToPython (factory (), oldHandler , signum );
274
+ Object result = handlerToPython (oldHandler , signum );
290
275
signalHandlers .put (signum , handler );
291
276
return result ;
292
277
}
@@ -310,10 +295,6 @@ private static Semaphore getSemaphore(PythonModule self, ReadAttributeFromObject
310
295
throw new IllegalStateException ("the signal trigger semaphore was modified!" );
311
296
}
312
297
}
313
-
314
- protected static boolean isJavaHandler (Object obj ) {
315
- return obj instanceof PJavaSignalHandler ;
316
- }
317
298
}
318
299
}
319
300
0 commit comments