mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-31 23:28:45 +00:00
Fix interactive --on-signal INT handlers
f8ba0ac5bf
introduced a bug where INT handlers would themselves be
cancelled, due to the signal. Defer processing handlers until the
parser is ready to execute more fish script.
Fixes the interactive case of #6649.
This commit is contained in:
parent
bfc1de9ef4
commit
bc702ccb31
3 changed files with 13 additions and 2 deletions
|
@ -288,6 +288,8 @@ void event_fire_delayed(parser_t &parser) {
|
||||||
auto &ld = parser.libdata();
|
auto &ld = parser.libdata();
|
||||||
// Do not invoke new event handlers from within event handlers.
|
// Do not invoke new event handlers from within event handlers.
|
||||||
if (ld.is_event) return;
|
if (ld.is_event) return;
|
||||||
|
// Do not invoke new event handlers if we are unwinding (#6649).
|
||||||
|
if (parser.get_cancel_signal()) return;
|
||||||
|
|
||||||
std::vector<shared_ptr<event_t>> to_send;
|
std::vector<shared_ptr<event_t>> to_send;
|
||||||
to_send.swap(ld.blocked_events);
|
to_send.swap(ld.blocked_events);
|
||||||
|
|
|
@ -376,6 +376,9 @@ class parser_t : public std::enable_shared_from_this<parser_t> {
|
||||||
void get_backtrace(const wcstring &src, const parse_error_list_t &errors,
|
void get_backtrace(const wcstring &src, const parse_error_list_t &errors,
|
||||||
wcstring &output) const;
|
wcstring &output) const;
|
||||||
|
|
||||||
|
/// \return the signal triggering cancellation, or 0 if none.
|
||||||
|
int get_cancel_signal() const { return cancellation_signal; }
|
||||||
|
|
||||||
/// Output profiling data to the given filename.
|
/// Output profiling data to the given filename.
|
||||||
void emit_profiling(const char *path) const;
|
void emit_profiling(const char *path) const;
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,17 @@
|
||||||
#
|
#
|
||||||
# Test signal handling for interactive shells.
|
# Test signal handling for interactive shells.
|
||||||
|
|
||||||
|
set pid [spawn $fish]
|
||||||
|
expect_prompt
|
||||||
|
|
||||||
|
send_line "function stuffs --on-signal INT; echo SIGINT spotted; end"
|
||||||
|
expect_prompt
|
||||||
|
exec -- kill -INT $pid
|
||||||
|
expect "SIGINT spotted"
|
||||||
|
|
||||||
# Verify that sending SIGHUP to the shell, such as will happen when the tty is
|
# Verify that sending SIGHUP to the shell, such as will happen when the tty is
|
||||||
# closed by the terminal, terminates the shell and the foreground command and
|
# closed by the terminal, terminates the shell and the foreground command and
|
||||||
# any background commands run from that shell.
|
# any background commands run from that shell.
|
||||||
set pid [spawn $fish]
|
|
||||||
expect_prompt
|
|
||||||
send "sleep 130 &\r"
|
send "sleep 130 &\r"
|
||||||
expect_prompt
|
expect_prompt
|
||||||
send "sleep 131 &\r"
|
send "sleep 131 &\r"
|
||||||
|
|
Loading…
Reference in a new issue