mirror of
https://github.com/tmux/tmux.git
synced 2024-11-05 02:18:47 +00:00
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.
This commit is contained in:
parent
d57ba5e30b
commit
738489f2bb
@ -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 <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)
|
||||
|
5
tmux.h
5
tmux.h
@ -1,4 +1,4 @@
|
||||
/* $Id: tmux.h,v 1.489 2009-10-28 23:14:15 tcunha Exp $ */
|
||||
/* $Id: tmux.h,v 1.490 2009-11-02 21:32:52 tcunha Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||
@ -63,6 +63,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!
|
||||
|
Loading…
Reference in New Issue
Block a user