changeset 11977:701aea3bc68b v8.0.0869

patch 8.0.0869: job output is sometimes not displayed in a terminal commit https://github.com/vim/vim/commit/a9f028103fee253ea8a09e49031011ee3da69ece Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 5 17:40:38 2017 +0200 patch 8.0.0869: job output is sometimes not displayed in a terminal Problem: Job output is sometimes not displayed in a terminal. Solution: Flush output before closing the channel.
author Christian Brabandt <cb@256bit.org>
date Sat, 05 Aug 2017 17:45:03 +0200
parents f7767ff24574
children baa9bbdc4364
files src/channel.c src/terminal.c src/version.c
diffstat 3 files changed, 54 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/src/channel.c
+++ b/src/channel.c
@@ -2817,25 +2817,40 @@ channel_close(channel_T *channel, int in
     ch_close_part(channel, PART_OUT);
     ch_close_part(channel, PART_ERR);
 
-    if (invoke_close_cb && channel->ch_close_cb != NULL)
+    if (invoke_close_cb)
     {
-	  typval_T	argv[1];
-	  typval_T	rettv;
-	  int		dummy;
-	  ch_part_T	part;
-
-	  /* Invoke callbacks before the close callback, since it's weird to
-	   * first invoke the close callback.  Increment the refcount to avoid
-	   * the channel being freed halfway. */
-	  ++channel->ch_refcount;
-	  ch_log(channel, "Invoking callbacks before closing");
-	  for (part = PART_SOCK; part < PART_IN; ++part)
-	      while (may_invoke_callback(channel, part))
-		  ;
-
-	  /* Invoke the close callback, if still set. */
-	  if (channel->ch_close_cb != NULL)
-	  {
+	ch_part_T	part;
+
+	/* Invoke callbacks and flush buffers before the close callback. */
+	if (channel->ch_close_cb != NULL)
+	    ch_log(channel,
+		     "Invoking callbacks and flushing buffers before closing");
+	for (part = PART_SOCK; part < PART_IN; ++part)
+	{
+	    if (channel->ch_close_cb != NULL
+			    || channel->ch_part[part].ch_bufref.br_buf != NULL)
+	    {
+		/* Increment the refcount to avoid the channel being freed
+		 * halfway. */
+		++channel->ch_refcount;
+		if (channel->ch_close_cb == NULL)
+		    ch_log(channel, "flushing %s buffers before closing",
+							     part_names[part]);
+		while (may_invoke_callback(channel, part))
+		    ;
+		--channel->ch_refcount;
+	    }
+	}
+
+	if (channel->ch_close_cb != NULL)
+	{
+	      typval_T	argv[1];
+	      typval_T	rettv;
+	      int		dummy;
+
+	      /* Increment the refcount to avoid the channel being freed
+	       * halfway. */
+	      ++channel->ch_refcount;
 	      ch_log(channel, "Invoking close callback %s",
 						(char *)channel->ch_close_cb);
 	      argv[0].v_type = VAR_CHANNEL;
@@ -2845,25 +2860,25 @@ channel_close(channel_T *channel, int in
 			   channel->ch_close_partial, NULL);
 	      clear_tv(&rettv);
 	      channel_need_redraw = TRUE;
-	  }
-
-	  /* the callback is only called once */
-	  free_callback(channel->ch_close_cb, channel->ch_close_partial);
-	  channel->ch_close_cb = NULL;
-	  channel->ch_close_partial = NULL;
-
-	  --channel->ch_refcount;
-
-	  if (channel_need_redraw)
-	  {
-	      channel_need_redraw = FALSE;
-	      redraw_after_callback();
-	  }
-
-	  if (!channel->ch_drop_never)
-	      /* any remaining messages are useless now */
-	      for (part = PART_SOCK; part < PART_IN; ++part)
-		  drop_messages(channel, part);
+
+	      /* the callback is only called once */
+	      free_callback(channel->ch_close_cb, channel->ch_close_partial);
+	      channel->ch_close_cb = NULL;
+	      channel->ch_close_partial = NULL;
+
+	      --channel->ch_refcount;
+
+	      if (channel_need_redraw)
+	      {
+		  channel_need_redraw = FALSE;
+		  redraw_after_callback();
+	      }
+
+	      if (!channel->ch_drop_never)
+		  /* any remaining messages are useless now */
+		  for (part = PART_SOCK; part < PART_IN; ++part)
+		      drop_messages(channel, part);
+	}
     }
 
     channel->ch_nb_close_cb = NULL;
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -36,7 +36,6 @@
  * that buffer, attributes come from the scrollback buffer tl_scrollback.
  *
  * TODO:
- * - job_start('ls') sometimes does not work.
  * - MS-Windows: no redraw for 'updatetime'  #1915
  * - in bash mouse clicks are inserting characters.
  * - mouse scroll: when over other window, scroll that window.
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    869,
+/**/
     868,
 /**/
     867,