From c5443da2d3bd5ef2464cc59941e55890aaff3fb0 Mon Sep 17 00:00:00 2001 From: nicm <nicm> Date: Fri, 29 Apr 2016 13:36:10 +0000 Subject: [PATCH] The backoff timer is causing no end of trouble with disconnected clients stopping data in attached ones. So get rid of it and see how we get on with just a high watermark on each pane. --- tmux.h | 12 ++---------- window.c | 39 +++------------------------------------ 2 files changed, 5 insertions(+), 46 deletions(-) diff --git a/tmux.h b/tmux.h index 0ceb14e9..d6cf114e 100644 --- a/tmux.h +++ b/tmux.h @@ -60,15 +60,8 @@ struct tmuxproc; /* Automatic name refresh interval, in microseconds. Must be < 1 second. */ #define NAME_INTERVAL 500000 -/* - * READ_SIZE is the maximum size of data to hold from a pty (the event high - * watermark). READ_BACKOFF is the amount of data waiting to be output to a tty - * before pty reads will be backed off. READ_TIME is how long to back off - * before the next read (in microseconds) if a tty is above READ_BACKOFF. - */ -#define READ_SIZE 1024 -#define READ_BACKOFF 512 -#define READ_TIME 100 +/* The maximum amount of data to hold from a pty (the event high watermark). */ +#define READ_SIZE 128 /* Attribute to make gcc check printf-like arguments. */ #define printflike(a, b) __attribute__ ((format (printf, a, b))) @@ -889,7 +882,6 @@ struct window_pane { int fd; struct bufferevent *event; - struct event timer; struct input_ctx *ictx; diff --git a/window.c b/window.c index 1769552f..ff90906f 100644 --- a/window.c +++ b/window.c @@ -777,9 +777,6 @@ window_pane_destroy(struct window_pane *wp) { window_pane_reset_mode(wp); - if (event_initialized(&wp->timer)) - evtimer_del(&wp->timer); - if (wp->fd != -1) { bufferevent_free(wp->event); close(wp->fd); @@ -916,35 +913,16 @@ window_pane_spawn(struct window_pane *wp, int argc, char **argv, return (0); } -void -window_pane_timer_callback(__unused int fd, __unused short events, void *data) -{ - window_pane_read_callback(NULL, data); -} - void window_pane_read_callback(__unused struct bufferevent *bufev, void *data) { struct window_pane *wp = data; struct evbuffer *evb = wp->event->input; char *new_data; - size_t new_size, available; - struct client *c; - struct timeval tv; + size_t new_size; - if (event_initialized(&wp->timer)) - evtimer_del(&wp->timer); - - log_debug("%%%u has %zu bytes", wp->id, EVBUFFER_LENGTH(evb)); - - TAILQ_FOREACH(c, &clients, entry) { - if (!tty_client_ready(c, wp)) - continue; - - available = EVBUFFER_LENGTH(c->tty.event->output); - if (available > READ_BACKOFF) - goto start_timer; - } + log_debug("%%%u has %zu bytes (of %zu)", wp->id, EVBUFFER_LENGTH(evb), + (size_t)READ_SIZE); new_size = EVBUFFER_LENGTH(evb) - wp->pipe_off; if (wp->pipe_fd != -1 && new_size > 0) { @@ -955,17 +933,6 @@ window_pane_read_callback(__unused struct bufferevent *bufev, void *data) input_parse(wp); wp->pipe_off = EVBUFFER_LENGTH(evb); - return; - -start_timer: - log_debug("%%%u backing off (%s %zu > %d)", wp->id, c->ttyname, - available, READ_BACKOFF); - - tv.tv_sec = 0; - tv.tv_usec = READ_TIME; - - evtimer_set(&wp->timer, window_pane_timer_callback, wp); - evtimer_add(&wp->timer, &tv); } void