=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window.c,v retrieving revision 1.165 retrieving revision 1.166 diff -c -r1.165 -r1.166 *** src/usr.bin/tmux/window.c 2016/07/15 09:52:34 1.165 --- src/usr.bin/tmux/window.c 2016/09/16 13:43:41 1.166 *************** *** 1,4 **** ! /* $OpenBSD: window.c,v 1.165 2016/07/15 09:52:34 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window.c,v 1.166 2016/09/16 13:43:41 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 56,71 **** /* Global panes tree. */ struct window_pane_tree all_window_panes; ! u_int next_window_pane_id; ! u_int next_window_id; ! u_int next_active_point; ! void window_pane_timer_callback(int, short, void *); ! void window_pane_read_callback(struct bufferevent *, void *); ! void window_pane_error_callback(struct bufferevent *, short, void *); ! struct window_pane *window_pane_choose_best(struct window_pane **, u_int); RB_GENERATE(windows, window, entry, window_cmp); int --- 56,73 ---- /* Global panes tree. */ struct window_pane_tree all_window_panes; ! static u_int next_window_pane_id; ! static u_int next_window_id; ! static u_int next_active_point; ! static void window_pane_set_watermark(struct window_pane *, size_t); ! static void window_pane_read_callback(struct bufferevent *, void *); ! static void window_pane_error_callback(struct bufferevent *, short, void *); + static struct window_pane *window_pane_choose_best(struct window_pane **, + u_int); + RB_GENERATE(windows, window, entry, window_cmp); int *************** *** 809,814 **** --- 811,824 ---- free(wp); } + static void + window_pane_set_watermark(struct window_pane *wp, size_t size) + { + wp->wmark_hits = 0; + wp->wmark_size = size; + bufferevent_setwatermark(wp->event, EV_READ, 0, size); + } + int window_pane_spawn(struct window_pane *wp, int argc, char **argv, const char *path, const char *shell, const char *cwd, struct environ *env, *************** *** 915,939 **** wp->event = bufferevent_new(wp->fd, window_pane_read_callback, NULL, window_pane_error_callback, wp); ! bufferevent_setwatermark(wp->event, EV_READ, 0, READ_SIZE); bufferevent_enable(wp->event, EV_READ|EV_WRITE); free(cmd); return (0); } ! 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; ! 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) { new_data = EVBUFFER_DATA(evb) + wp->pipe_off; bufferevent_write(wp->pipe_event, new_data, new_size); --- 925,961 ---- wp->event = bufferevent_new(wp->fd, window_pane_read_callback, NULL, window_pane_error_callback, wp); ! window_pane_set_watermark(wp, READ_FAST_SIZE); bufferevent_enable(wp->event, EV_READ|EV_WRITE); free(cmd); return (0); } ! static void window_pane_read_callback(__unused struct bufferevent *bufev, void *data) { struct window_pane *wp = data; struct evbuffer *evb = wp->event->input; + size_t size = EVBUFFER_LENGTH(evb); char *new_data; size_t new_size; ! if (wp->wmark_size == READ_FAST_SIZE) { ! if (size > READ_FULL_SIZE) ! wp->wmark_hits++; ! if (wp->wmark_hits == READ_CHANGE_HITS) ! window_pane_set_watermark(wp, READ_SLOW_SIZE); ! } else if (wp->wmark_size == READ_SLOW_SIZE) { ! if (size < READ_EMPTY_SIZE) ! wp->wmark_hits++; ! if (wp->wmark_hits == READ_CHANGE_HITS) ! window_pane_set_watermark(wp, READ_FAST_SIZE); ! } ! log_debug("%%%u has %zu bytes (of %u, %u hits)", wp->id, size, ! wp->wmark_size, wp->wmark_hits); ! new_size = size - wp->pipe_off; if (wp->pipe_fd != -1 && new_size > 0) { new_data = EVBUFFER_DATA(evb) + wp->pipe_off; bufferevent_write(wp->pipe_event, new_data, new_size); *************** *** 941,950 **** input_parse(wp); ! wp->pipe_off = EVBUFFER_LENGTH(evb); } ! void window_pane_error_callback(__unused struct bufferevent *bufev, __unused short what, void *data) { --- 963,972 ---- input_parse(wp); ! wp->pipe_off = size; } ! static void window_pane_error_callback(__unused struct bufferevent *bufev, __unused short what, void *data) { *************** *** 1182,1188 **** } /* Get MRU pane from a list. */ ! struct window_pane * window_pane_choose_best(struct window_pane **list, u_int size) { struct window_pane *next, *best; --- 1204,1210 ---- } /* Get MRU pane from a list. */ ! static struct window_pane * window_pane_choose_best(struct window_pane **list, u_int size) { struct window_pane *next, *best;