Mercurial > vim
diff src/misc2.c @ 15160:ec67c6b8ef12 v8.1.0590
patch 8.1.0590: when a job ends the closed channels are not handled
commit https://github.com/vim/vim/commit/cd1a62d468a55aca68deb3139d83530c7c23568d
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Dec 14 21:32:02 2018 +0100
patch 8.1.0590: when a job ends the closed channels are not handled
Problem: When a job ends the closed channels are not handled.
Solution: When a job is detected to have ended, check the channels again.
(closes #3530)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 14 Dec 2018 21:45:05 +0100 |
parents | 9df130fd5e0d |
children | 90ab2d3ce11d |
line wrap: on
line diff
--- a/src/misc2.c +++ b/src/misc2.c @@ -6351,6 +6351,8 @@ has_non_ascii(char_u *s) #endif #if defined(MESSAGE_QUEUE) || defined(PROTO) +# define MAX_REPEAT_PARSE 8 + /* * Process messages that have been queued for netbeans or clientserver. * Also check if any jobs have ended. @@ -6360,37 +6362,45 @@ has_non_ascii(char_u *s) void parse_queued_messages(void) { - win_T *old_curwin = curwin; + win_T *old_curwin = curwin; + int i; // Do not handle messages while redrawing, because it may cause buffers to // change or be wiped while they are being redrawn. if (updating_screen) return; - // For Win32 mch_breakcheck() does not check for input, do it here. + // Loop when a job ended, but don't keep looping forever. + for (i = 0; i < MAX_REPEAT_PARSE; ++i) + { + // For Win32 mch_breakcheck() does not check for input, do it here. # if defined(WIN32) && defined(FEAT_JOB_CHANNEL) - channel_handle_events(FALSE); + channel_handle_events(FALSE); # endif # ifdef FEAT_NETBEANS_INTG - // Process the queued netbeans messages. - netbeans_parse_messages(); + // Process the queued netbeans messages. + netbeans_parse_messages(); # endif # ifdef FEAT_JOB_CHANNEL - // Write any buffer lines still to be written. - channel_write_any_lines(); - - // Process the messages queued on channels. - channel_parse_messages(); + // Write any buffer lines still to be written. + channel_write_any_lines(); + + // Process the messages queued on channels. + channel_parse_messages(); # endif # if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11) - // Process the queued clientserver messages. - server_parse_messages(); + // Process the queued clientserver messages. + server_parse_messages(); # endif # ifdef FEAT_JOB_CHANNEL - // Check if any jobs have ended. - job_check_ended(); + // Check if any jobs have ended. If so, repeat the above to handle + // changes, e.g. stdin may have been closed. + if (job_check_ended()) + continue; # endif + break; + } // If the current window changed we need to bail out of the waiting loop. // E.g. when a job exit callback closes the terminal window.