Skip to content

Commit 07ac1b2

Browse files
committed
Stash signal handlers around JLine terminal creation and readLine
1 parent 90020ae commit 07ac1b2

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

‎graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/JLineConsoleHandler.java‎

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,11 @@
7474
import org.graalvm.shadowed.org.jline.terminal.Terminal;
7575
import org.graalvm.shadowed.org.jline.terminal.TerminalBuilder;
7676
import org.graalvm.shadowed.org.jline.utils.InputStreamReader;
77+
import org.graalvm.shadowed.org.jline.utils.Signals;
7778

7879
public class JLineConsoleHandler extends ConsoleHandler {
80+
private static final String[] SIGNALS = {"INT", "QUIT", "TSTP", "CONT", "WINCH"};
81+
7982
private final InputStream inputStream;
8083
private final OutputStream outputStream;
8184
private LineReader reader;
@@ -93,10 +96,13 @@ public class JLineConsoleHandler extends ConsoleHandler {
9396
@SuppressWarnings("unused")
9497
public void initializeReadline(Value readlineModule) {
9598
Terminal terminal;
99+
Object[] signalHandlers = stashSignalHandlers();
96100
try {
97-
terminal = TerminalBuilder.builder().jna(false).streams(inputStream, outputStream).system(true).nativeSignals(false).signalHandler(Terminal.SignalHandler.SIG_IGN).build();
101+
terminal = TerminalBuilder.builder().jna(false).streams(inputStream, outputStream).system(true).build();
98102
} catch (IOException ex) {
99103
throw new RuntimeException("unexpected error opening console reader", ex);
104+
} finally {
105+
restoreSignalHandlers(signalHandlers);
100106
}
101107
final Value getCompleter = readlineModule.getMember("get_completer");
102108
final Value shouldRecord = readlineModule.getMember("get_auto_history");
@@ -226,6 +232,7 @@ public String readLine(String prompt) {
226232
}
227233
}
228234
if (lineBuffer.isEmpty()) {
235+
Object[] signalHandlers = stashSignalHandlers();
229236
try {
230237
String lines = reader.readLine(prompt);
231238
Collections.addAll(lineBuffer, lines.split("\n"));
@@ -235,11 +242,27 @@ public String readLine(String prompt) {
235242
return null;
236243
} catch (Exception ex) {
237244
throw new RuntimeException(ex);
245+
} finally {
246+
restoreSignalHandlers(signalHandlers);
238247
}
239248
}
240249
return lineBuffer.poll();
241250
}
242251

252+
private static Object[] stashSignalHandlers() {
253+
Object[] handlers = new Object[SIGNALS.length];
254+
for (int i = 0; i < SIGNALS.length; i++) {
255+
handlers[i] = Signals.registerDefault(SIGNALS[i]);
256+
}
257+
return handlers;
258+
}
259+
260+
private static void restoreSignalHandlers(Object[] handlers) {
261+
for (int i = 0; i < SIGNALS.length; i++) {
262+
Signals.unregister(SIGNALS[i], handlers[i]);
263+
}
264+
}
265+
243266
// Used via interop
244267
@SuppressWarnings("unused")
245268
public CompletionState getCompletionState() {

0 commit comments

Comments
 (0)