@@ -252,18 +252,17 @@ protected boolean restoreDefault(Object signalString, Object action,
252
252
@ Specialization (guards = "libSignalString.isRubyString(signalString)" )
253
253
protected boolean watchSignalProc (Object signalString , RubyProc action ,
254
254
@ CachedLibrary (limit = "2" ) RubyStringLibrary libSignalString ) {
255
- if (getContext ().getThreadManager ().getCurrentThread () != getContext ().getThreadManager ().getRootThread ()) {
255
+ final RubyContext context = getContext ();
256
+
257
+ if (context .getThreadManager ().getCurrentThread () != context .getThreadManager ().getRootThread ()) {
256
258
// The proc will be executed on the main thread
257
259
SharedObjects .writeBarrier (getLanguage (), action );
258
260
}
259
261
260
- final RubyContext context = getContext ();
261
-
262
- String signalName = libSignalString .getJavaString (signalString );
262
+ final String signalName = libSignalString .getJavaString (signalString );
263
263
return registerHandler (signalName , signal -> {
264
264
if (context .getOptions ().SINGLE_THREADED ) {
265
- RubyLanguage .LOGGER .severe (
266
- "signal " + signal + " caught but can't create a thread to handle it so ignoring" );
265
+ warnRestoreAndRaise (context , signalName , signal , "create a thread" );
267
266
return ;
268
267
}
269
268
@@ -276,16 +275,7 @@ protected boolean watchSignalProc(Object signalString, RubyProc action,
276
275
try {
277
276
prev = truffleContext .enter (this );
278
277
} catch (IllegalStateException e ) { // Multi threaded access denied from Truffle
279
- // Not in a context, so we cannot use TruffleLogger
280
- context .getEnvErrStream ().println (
281
- "[ruby] SEVERE: signal " + signal +
282
- " caught but can't attach a thread to handle it so restoring the default handler and re-raising the signal" );
283
- Signals .restoreDefaultHandler (signalName );
284
- try {
285
- Signal .raise (signal );
286
- } catch (IllegalArgumentException illegalArgumentException ) {
287
- illegalArgumentException .printStackTrace (context .getEnvErrStream ());
288
- }
278
+ warnRestoreAndRaise (context , signalName , signal , "attach a thread" );
289
279
return ;
290
280
}
291
281
try {
@@ -299,6 +289,19 @@ protected boolean watchSignalProc(Object signalString, RubyProc action,
299
289
});
300
290
}
301
291
292
+ private static void warnRestoreAndRaise (RubyContext context , String signalName , Signal signal , String failure ) {
293
+ // Not in a context, so we cannot use TruffleLogger
294
+ context .getEnvErrStream ().println (
295
+ "[ruby] SEVERE: signal " + signal + " caught but can't " + failure +
296
+ " to handle it so restoring the default handler and re-raising the signal" );
297
+ Signals .restoreDefaultHandler (signalName );
298
+ try {
299
+ Signal .raise (signal );
300
+ } catch (IllegalArgumentException illegalArgumentException ) {
301
+ illegalArgumentException .printStackTrace (context .getEnvErrStream ());
302
+ }
303
+ }
304
+
302
305
@ TruffleBoundary
303
306
private boolean restoreDefaultHandler (String signalName ) {
304
307
if (getContext ().getOptions ().EMBEDDED ) {
0 commit comments