summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2009-10-28 22:53:15 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2009-10-28 22:53:15 +0000
commitc53ad1b7394069d5a82fe4a3b58a620a1103554e (patch)
tree3c5a1ad27edd60a24dd5d5624e47b7f2c44b9c64 /usr.bin
parentc95f9b914e097756a2eb05135945a2aabb8370c4 (diff)
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 'usr.bin')
-rw-r--r--usr.bin/tmux/server-window.c29
-rw-r--r--usr.bin/tmux/tmux.h5
2 files changed, 31 insertions, 3 deletions
diff --git a/usr.bin/tmux/server-window.c b/usr.bin/tmux/server-window.c
index 8184b0fb3ad..29d6641c9fc 100644
--- a/usr.bin/tmux/server-window.c
+++ b/usr.bin/tmux/server-window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-window.c,v 1.2 2009/10/27 13:03:33 nicm Exp $ */
+/* $OpenBSD: server-window.c,v 1.3 2009/10/28 22:53:14 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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)
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index f8b7778a6f9..a7ea4455666 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.151 2009/10/27 13:03:33 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.152 2009/10/28 22:53:14 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -65,6 +65,9 @@ extern char **environ;
/* Maximum poll timeout (when attached). */
#define POLL_TIMEOUT 50
+/* Maximum data to buffer for output before suspending reading from panes. */
+#define BACKOFF_THRESHOLD 1024
+
/*
* Maximum sizes of strings in message data. Don't forget to bump
* PROTOCOL_VERSION if any of these change!