mirror of https://github.com/tmux/tmux.git
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.pull/303/merge
parent
5f2bfd9807
commit
c5443da2d3
12
tmux.h
12
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;
|
||||
|
||||
|
|
39
window.c
39
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
|
||||
|
|
Loading…
Reference in New Issue