]> granicus.if.org Git - vim/commitdiff
patch 8.0.0869: job output is sometimes not displayed in a terminal v8.0.0869
authorBram Moolenaar <Bram@vim.org>
Sat, 5 Aug 2017 15:40:38 +0000 (17:40 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 5 Aug 2017 15:40:38 +0000 (17:40 +0200)
Problem:    Job output is sometimes not displayed in a terminal.
Solution:   Flush output before closing the channel.

src/channel.c
src/terminal.c
src/version.c

index 9d791a90574df3850d4bb90071ef599fe649353d..a4f1cc7b70e8b6a51fe369ce680104c2071f8a00 100644 (file)
@@ -2817,25 +2817,40 @@ channel_close(channel_T *channel, int invoke_close_cb)
     ch_close_part(channel, PART_OUT);
     ch_close_part(channel, PART_ERR);
 
-    if (invoke_close_cb && channel->ch_close_cb != NULL)
-    {
-         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)
-         {
+    if (invoke_close_cb)
+    {
+       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 invoke_close_cb)
                           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;
+             /* 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;
+             --channel->ch_refcount;
 
-         if (channel_need_redraw)
-         {
-             channel_need_redraw = FALSE;
-             redraw_after_callback();
-         }
+             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);
+             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;
index 1ce4db7e973e64d75cf55812252d9d496dc1bb69..b708f3e948a79bb3dc3e9e076bf9b47ecb5106cf 100644 (file)
@@ -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.
index a721d42546d2669b09a0bfa3bf74917774460088..d1b20b1733de53c8a02059cebf66f23a6c9142f1 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    869,
 /**/
     868,
 /**/