From 738489f2bb6bc28b6375c367b8313e376b2de5b1 Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Mon, 2 Nov 2009 21:32:52 +0000 Subject: Sync OpenBSD patchset 472: 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. --- server-window.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'server-window.c') diff --git a/server-window.c b/server-window.c index 0c57b990..91b91bce 100644 --- a/server-window.c +++ b/server-window.c @@ -1,4 +1,4 @@ -/* $Id: server-window.c,v 1.2 2009-10-28 23:14:15 tcunha Exp $ */ +/* $Id: server-window.c,v 1.3 2009-11-02 21:32:51 tcunha Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -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) -- cgit