diff options
author | nicm <nicm> | 2017-07-03 12:38:50 +0000 |
---|---|---|
committer | nicm <nicm> | 2017-07-03 12:38:50 +0000 |
commit | 6ee0afb579fc09cd36058b993f45eb2577a80e76 (patch) | |
tree | fec429120a6a5fa16170ae6283adbd3aa421a9b0 /window.c | |
parent | 28687f2d55fb30654a7164bf1445f47b052ea115 (diff) |
Change previous to not wait for both process exit and pty close -
instead if there is a pipe-pane active, do not exit until all data is
read (including any libevent hasn't seen yet). Fixes problem reported by
Theo Buehler and still seems to solve the original issue.
Diffstat (limited to 'window.c')
-rw-r--r-- | window.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -391,13 +391,17 @@ window_destroy(struct window *w) int window_pane_destroy_ready(struct window_pane *wp) { - if (wp->pipe_fd != -1 && EVBUFFER_LENGTH(wp->pipe_event->output) != 0) - return (0); + int n; + + if (wp->pipe_fd != -1) { + if (EVBUFFER_LENGTH(wp->pipe_event->output) != 0) + return (0); + if (ioctl(wp->fd, FIONREAD, &n) != -1 && n > 0) + return (0); + } if (~wp->flags & PANE_EXITED) return (0); - if (~wp->flags & PANE_ERROR) - return (0); return (1); } @@ -1014,7 +1018,7 @@ window_pane_error_callback(__unused struct bufferevent *bufev, struct window_pane *wp = data; log_debug("%%%u error", wp->id); - wp->flags |= PANE_ERROR; + wp->flags |= PANE_EXITED; if (window_pane_destroy_ready(wp)) server_destroy_pane(wp, 1); |