Change previous to not wait for both process exit and pty close -
authornicm <nicm@openbsd.org>
Mon, 3 Jul 2017 12:38:50 +0000 (12:38 +0000)
committernicm <nicm@openbsd.org>
Mon, 3 Jul 2017 12:38:50 +0000 (12:38 +0000)
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.

usr.bin/tmux/tmux.h
usr.bin/tmux/window.c

index 345da8a..5336609 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.790 2017/07/03 08:16:03 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.791 2017/07/03 12:38:50 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -768,8 +768,7 @@ struct window_pane {
 #define PANE_FOCUSPUSH 0x20
 #define PANE_INPUTOFF 0x40
 #define PANE_CHANGED 0x80
-#define PANE_ERROR 0x100
-#define PANE_EXITED 0x200
+#define PANE_EXITED 0x100
 
        int              argc;
        char           **argv;
index 2d3645a..f2f2d13 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: window.c,v 1.200 2017/07/03 08:16:03 nicm Exp $ */
+/* $OpenBSD: window.c,v 1.201 2017/07/03 12:38:50 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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);