diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2009-10-28 22:53:14 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2009-10-28 22:53:14 +0000 |
commit | dc3fdc8dc7c45fc4924ee4eeb8b6c7c6a80e41f1 (patch) | |
tree | fcc4e2b9506420e9b35c48811052cafc7866ee22 /server-window.c | |
parent | 1eaefbf1698fc66815e538fc3040f4446f444f7b (diff) | |
download | rtmux-dc3fdc8dc7c45fc4924ee4eeb8b6c7c6a80e41f1.tar.gz rtmux-dc3fdc8dc7c45fc4924ee4eeb8b6c7c6a80e41f1.tar.bz2 rtmux-dc3fdc8dc7c45fc4924ee4eeb8b6c7c6a80e41f1.zip |
If any client currently displaying a window pane has more than 1 KB of output
buffered, don't accept any further data from the process running in the pane.
This makes tmux much more responsive when flooded with output, although other
buffers can still have an impact when running remotely.
Prompted by a query from Ranganathan Sankaralingam.
Diffstat (limited to 'server-window.c')
-rw-r--r-- | server-window.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/server-window.c b/server-window.c index 969395c8..122ca092 100644 --- a/server-window.c +++ b/server-window.c @@ -22,6 +22,7 @@ #include "tmux.h" +int server_window_backoff(struct window_pane *); int server_window_check_bell(struct session *, struct window *); int server_window_check_activity(struct session *, struct window *); int server_window_check_content( @@ -44,7 +45,9 @@ server_window_prepare(void) TAILQ_FOREACH(wp, &w->panes, entry) { if (wp->fd == -1) continue; - events = POLLIN; + events = 0; + if (!server_window_backoff(wp)) + events |= POLLIN; if (BUFFER_USED(wp->out) > 0) events |= POLLOUT; server_poll_add( @@ -61,6 +64,28 @@ server_window_prepare(void) } } +/* Check if this window should suspend reading. */ +int +server_window_backoff(struct window_pane *wp) +{ + struct client *c; + u_int i; + + if (!window_pane_visible(wp)) + return (0); + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session == NULL) + continue; + if (c->session->curw->window != wp->window) + continue; + if (BUFFER_USED(c->tty.out) > BACKOFF_THRESHOLD) + return (1); + } + return (0); +} + /* Process a single window pane event. */ void server_window_callback(int fd, int events, void *data) |