mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-15 22:44:01 +00:00
Avoid excessive polling of universal variable file
Reproducible at least on Linux, where the "named pipe" universal variable notifier is used: rm -rf build/test/xdg_config XDG_CONFIG_HOME=build/test/xdg_config ./build/fish -c "xterm -e ./build/fish" The child fish reacts to keyboard input with a noticeable initial delay. This is because the universal variable file is polled over a million times, even when I immediately press Control-D. This polling prevents readb() from handling keyboard input. Before commit939aba02d
("Refactor input_common.cpp:readb"), readb() reacted to keyboard input even when there were universal variable notifications. Restore this behavior, but make sure to call the universal variable notifier after the new "prepare_to_select" logic. Maybe the problem is in the notifier but the old behavior was sane. Fixes the problems described in7a556ec6f2 (commitcomment-49773677)
Adding "-d uvars-file" to the reproducesr shows that we are checking the uvar file repeatedly: uvar-file: universal log sync uvar-file: universal log sync elided based on fast stat() uvar-file: universal log no modifications
This commit is contained in:
parent
c55aa48308
commit
b56b230076
2 changed files with 5 additions and 7 deletions
|
@ -57,7 +57,7 @@ enum {
|
||||||
};
|
};
|
||||||
using readb_result_t = int;
|
using readb_result_t = int;
|
||||||
|
|
||||||
static readb_result_t readb(int in_fd) {
|
static readb_result_t readb(int in_fd, bool queue_is_empty) {
|
||||||
assert(in_fd >= 0 && "Invalid in fd");
|
assert(in_fd >= 0 && "Invalid in fd");
|
||||||
universal_notifier_t& notifier = universal_notifier_t::default_notifier();
|
universal_notifier_t& notifier = universal_notifier_t::default_notifier();
|
||||||
select_wrapper_t fdset;
|
select_wrapper_t fdset;
|
||||||
|
@ -98,7 +98,9 @@ static readb_result_t readb(int in_fd) {
|
||||||
// This may come about through readability, or through a call to poll().
|
// This may come about through readability, or through a call to poll().
|
||||||
if (notifier.poll() ||
|
if (notifier.poll() ||
|
||||||
(fdset.test(notifier_fd) && notifier.notification_fd_became_readable(notifier_fd))) {
|
(fdset.test(notifier_fd) && notifier.notification_fd_became_readable(notifier_fd))) {
|
||||||
return readb_uvar_notified;
|
if (env_universal_barrier() && !queue_is_empty) {
|
||||||
|
return readb_uvar_notified;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check stdin.
|
// Check stdin.
|
||||||
|
@ -167,7 +169,7 @@ char_event_t input_event_queue_t::readch() {
|
||||||
return mevt.acquire();
|
return mevt.acquire();
|
||||||
}
|
}
|
||||||
|
|
||||||
readb_result_t rr = readb(in_);
|
readb_result_t rr = readb(in_, queue_.empty());
|
||||||
switch (rr) {
|
switch (rr) {
|
||||||
case readb_eof:
|
case readb_eof:
|
||||||
return char_event_type_t::eof;
|
return char_event_type_t::eof;
|
||||||
|
@ -178,7 +180,6 @@ char_event_t input_event_queue_t::readch() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case readb_uvar_notified:
|
case readb_uvar_notified:
|
||||||
env_universal_barrier();
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case readb_ioport_notified:
|
case readb_ioport_notified:
|
||||||
|
|
|
@ -3,9 +3,6 @@
|
||||||
# Don't run this on GitHub Actions since it's flaky.
|
# Don't run this on GitHub Actions since it's flaky.
|
||||||
#REQUIRES: test "$CI" != true
|
#REQUIRES: test "$CI" != true
|
||||||
|
|
||||||
# HACK: THIS IS DISABLED for now, since it doesn't work at the moment.
|
|
||||||
#REQUIRES: false
|
|
||||||
|
|
||||||
# Isolated tmux.
|
# Isolated tmux.
|
||||||
set -g tmpdir (mktemp -d)
|
set -g tmpdir (mktemp -d)
|
||||||
set -g tmux tmux -S $tmpdir/.tmux-socket -f /dev/null
|
set -g tmux tmux -S $tmpdir/.tmux-socket -f /dev/null
|
||||||
|
|
Loading…
Reference in a new issue