version 1.157, 2016/03/01 12:05:15 |
version 1.158, 2016/04/29 13:36:11 |
|
|
{ |
{ |
window_pane_reset_mode(wp); |
window_pane_reset_mode(wp); |
|
|
if (event_initialized(&wp->timer)) |
|
evtimer_del(&wp->timer); |
|
|
|
if (wp->fd != -1) { |
if (wp->fd != -1) { |
bufferevent_free(wp->event); |
bufferevent_free(wp->event); |
close(wp->fd); |
close(wp->fd); |
|
|
} |
} |
|
|
void |
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) |
window_pane_read_callback(__unused struct bufferevent *bufev, void *data) |
{ |
{ |
struct window_pane *wp = data; |
struct window_pane *wp = data; |
struct evbuffer *evb = wp->event->input; |
struct evbuffer *evb = wp->event->input; |
char *new_data; |
char *new_data; |
size_t new_size, available; |
size_t new_size; |
struct client *c; |
|
struct timeval tv; |
|
|
|
if (event_initialized(&wp->timer)) |
log_debug("%%%u has %zu bytes (of %zu)", wp->id, EVBUFFER_LENGTH(evb), |
evtimer_del(&wp->timer); |
(size_t)READ_SIZE); |
|
|
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; |
|
} |
|
|
|
new_size = EVBUFFER_LENGTH(evb) - wp->pipe_off; |
new_size = EVBUFFER_LENGTH(evb) - wp->pipe_off; |
if (wp->pipe_fd != -1 && new_size > 0) { |
if (wp->pipe_fd != -1 && new_size > 0) { |
new_data = EVBUFFER_DATA(evb) + wp->pipe_off; |
new_data = EVBUFFER_DATA(evb) + wp->pipe_off; |
|
|
input_parse(wp); |
input_parse(wp); |
|
|
wp->pipe_off = EVBUFFER_LENGTH(evb); |
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 |
void |