Patch 8.1.0710
Problem: When using timers may wait for job exit quite long.
Solution: Return from ui_wait_for_chars_or_timer() when a job or channel
needs to be handled. (Ozaki Kiichi, closes #3783)
Files: src/ui.c, src/testdir/test_channel.vim
*** ../vim-8.1.0709/src/ui.c 2018-11-26 21:19:08.045334122 +0100
--- src/ui.c 2019-01-09 22:23:58.532511473 +0100
***************
*** 205,211 ****
return retval;
}
! #if defined(FEAT_TIMERS) || defined(PROT)
/*
* Wait for a timer to fire or "wait_func" to return non-zero.
* Returns OK when something was read.
--- 205,211 ----
return retval;
}
! #if defined(FEAT_TIMERS) || defined(PROTO)
/*
* Wait for a timer to fire or "wait_func" to return non-zero.
* Returns OK when something was read.
***************
*** 221,235 ****
int due_time;
long remaining = wtime;
int tb_change_cnt = typebuf.tb_change_cnt;
! /* When waiting very briefly don't trigger timers. */
if (wtime >= 0 && wtime < 10L)
return wait_func(wtime, NULL, ignore_input);
while (wtime < 0 || remaining > 0)
{
! /* Trigger timers and then get the time in wtime until the next one is
! * due. Wait up to that time. */
due_time = check_due_timer();
if (typebuf.tb_change_cnt != tb_change_cnt)
{
--- 221,238 ----
int due_time;
long remaining = wtime;
int tb_change_cnt = typebuf.tb_change_cnt;
+ # ifdef FEAT_JOB_CHANNEL
+ int brief_wait = TRUE;
+ # endif
! // When waiting very briefly don't trigger timers.
if (wtime >= 0 && wtime < 10L)
return wait_func(wtime, NULL, ignore_input);
while (wtime < 0 || remaining > 0)
{
! // Trigger timers and then get the time in wtime until the next one is
! // due. Wait up to that time.
due_time = check_due_timer();
if (typebuf.tb_change_cnt != tb_change_cnt)
{
***************
*** 238,248 ****
}
if (due_time <= 0 || (wtime > 0 && due_time > remaining))
due_time = remaining;
if (wait_func(due_time, interrupted, ignore_input))
return OK;
! if (interrupted != NULL && *interrupted)
! /* Nothing available, but need to return so that side effects get
! * handled, such as handling a message on a channel. */
return FAIL;
if (wtime > 0)
remaining -= due_time;
--- 241,268 ----
}
if (due_time <= 0 || (wtime > 0 && due_time > remaining))
due_time = remaining;
+ # ifdef FEAT_JOB_CHANNEL
+ if ((due_time < 0 || due_time > 10L)
+ # ifdef FEAT_GUI
+ && !gui.in_use
+ # endif
+ && (has_pending_job() || channel_any_readahead()))
+ {
+ // There is a pending job or channel, should return soon in order
+ // to handle them ASAP. Do check for input briefly.
+ due_time = 10L;
+ brief_wait = TRUE;
+ }
+ # endif
if (wait_func(due_time, interrupted, ignore_input))
return OK;
! if ((interrupted != NULL && *interrupted)
! # ifdef FEAT_JOB_CHANNEL
! || brief_wait
! # endif
! )
! // Nothing available, but need to return so that side effects get
! // handled, such as handling a message on a channel.
return FAIL;
if (wtime > 0)
remaining -= due_time;
***************
*** 252,258 ****
#endif
/*
! * return non-zero if a character is available
*/
int
ui_char_avail(void)
--- 272,278 ----
#endif
/*
! * Return non-zero if a character is available.
*/
int
ui_char_avail(void)
*** ../vim-8.1.0709/src/testdir/test_channel.vim 2019-01-05
00:35:17.298497431 +0100
--- src/testdir/test_channel.vim 2019-01-09 22:22:45.001047737 +0100
***************
*** 1893,1895 ****
--- 1893,1932 ----
call assert_inrange(200, 1000, elapsed)
call job_stop(job)
endfunc
+
+ func Test_job_start_in_timer()
+ if !has('job') || !has('timers')
+ return
+ endif
+
+ func OutCb(chan, msg)
+ endfunc
+
+ func ExitCb(job, status)
+ let g:val = 1
+ call Resume()
+ endfunc
+
+ func TimerCb(timer)
+ if has('win32')
+ let cmd = ['cmd', '/c', 'echo.']
+ else
+ let cmd = ['echo']
+ endif
+ let g:job = job_start(cmd, {'out_cb': 'OutCb', 'exit_cb': 'ExitCb'})
+ call substitute(repeat('a', 100000), '.', '', 'g')
+ endfunc
+
+ " We should be interrupted before 'updatetime' elapsed.
+ let g:val = 0
+ call timer_start(1, 'TimerCb')
+ let elapsed = Standby(&ut)
+ call assert_inrange(1, &ut / 2, elapsed)
+ call job_stop(g:job)
+
+ delfunc OutCb
+ delfunc ExitCb
+ delfunc TimerCb
+ unlet! g:val
+ unlet! g:job
+ endfunc
*** ../vim-8.1.0709/src/version.c 2019-01-09 21:47:26.356341693 +0100
--- src/version.c 2019-01-09 22:24:17.488373212 +0100
***************
*** 801,802 ****
--- 801,804 ----
{ /* Add new patch number below this line */
+ /**/
+ 710,
/**/
--
hundred-and-one symptoms of being an internet addict:
138. You develop a liking for cold coffee.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.