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.
This commit is contained in:
nicm 2017-07-03 12:38:50 +00:00
parent 28687f2d55
commit 6ee0afb579
2 changed files with 10 additions and 7 deletions

3
tmux.h
View File

@ -768,8 +768,7 @@ struct window_pane {
#define PANE_FOCUSPUSH 0x20 #define PANE_FOCUSPUSH 0x20
#define PANE_INPUTOFF 0x40 #define PANE_INPUTOFF 0x40
#define PANE_CHANGED 0x80 #define PANE_CHANGED 0x80
#define PANE_ERROR 0x100 #define PANE_EXITED 0x100
#define PANE_EXITED 0x200
int argc; int argc;
char **argv; char **argv;

View File

@ -391,13 +391,17 @@ window_destroy(struct window *w)
int int
window_pane_destroy_ready(struct window_pane *wp) window_pane_destroy_ready(struct window_pane *wp)
{ {
if (wp->pipe_fd != -1 && EVBUFFER_LENGTH(wp->pipe_event->output) != 0) int n;
if (wp->pipe_fd != -1) {
if (EVBUFFER_LENGTH(wp->pipe_event->output) != 0)
return (0); return (0);
if (ioctl(wp->fd, FIONREAD, &n) != -1 && n > 0)
return (0);
}
if (~wp->flags & PANE_EXITED) if (~wp->flags & PANE_EXITED)
return (0); return (0);
if (~wp->flags & PANE_ERROR)
return (0);
return (1); return (1);
} }
@ -1014,7 +1018,7 @@ window_pane_error_callback(__unused struct bufferevent *bufev,
struct window_pane *wp = data; struct window_pane *wp = data;
log_debug("%%%u error", wp->id); log_debug("%%%u error", wp->id);
wp->flags |= PANE_ERROR; wp->flags |= PANE_EXITED;
if (window_pane_destroy_ready(wp)) if (window_pane_destroy_ready(wp))
server_destroy_pane(wp, 1); server_destroy_pane(wp, 1);