Ozaki Kiichi wrote:

> Solaris (and maybe other SunOS distributions) have odd select()
> syscall behavior on tty, and it affects input-waiting of vim.
> 
> [example]
> 
> ------
> while 1
>   let c = getchar(0)
>   if c != 0
>     break
>   endif
>   sleep 20m
>   if another_condition()
>     break
>   endif
> endwhile
> ------
> 
> This script waits user input or establishment of another condition, otherwise 
> does sleeping.
> Actially it checks input by select() syscall in 2 places; in getchar(0) and 
> end of sleep.
> 
> * in getchar(0), select() is called with tty non-canonical mode (TMODE_RAW)
> * in sleep, select() is called with tty canonical mode (TMODE_SLEEP)
> 
> That is;
> 
> ------
> select() [non-canon] ... (a)
> (20ms)               ... (b)
> select() [canon]     ... (c)
> (back to top-of-loop)
> select() [non-canon] ... (a')
> ...
> ------
> 
> On linux and mac (maybe *bsd):
> 
> input during (a): detected by select(a) and breaks a loop instantly
> input during (b)~(c): not detected by select(c), and detected by select(a') 
> and breaks a loop
> 
> That is, input during canon-mode is detected at non-canon-mode.
> 
> On solaris:
> 
> input during (a): detected by select(a) and breaks a loop instantly
> input during (b)~(c): not detected by either select(c) or select(a') (unless 
> input <CR>)
> 
> That is, input during canon-mode is *NOT* detected at non-canon-mode,
> so breaking-loop needs input during (a) or input <CR> to finish 
> line-buffering (or, in this case, establish another_condition).
> 
> # input during (b)~(c) is retained, not diacarded.
> # example:
> # (b)~(c) <- input "123"
> # (a') <- input "4"
> # select(a') detects input and read() reads "1234" from tty.
> 
> [patch]
> 
> Drop ICANON flag (and set VMIN to 1 VTIME to 0) at TMODE_SLEEP
> 
> https://gist.github.com/ichizok/acae1b5431a639108dd8cf2768823dc2
> 
> # This patch is part of 
> https://groups.google.com/forum/#!msg/vim_dev/8ciQGDB-0Og/NiaJYwQHKF8J

Thanks for diving into this.  This problem must have existed for a long
time, I wonder why nobody reported it before.

Since the patch is for Solaris (or perhaps SysV kind of Unix?), should
we add this inside an #ifdef?  Or would it be OK to do the same on all
systems?

-- 
hundred-and-one symptoms of being an internet addict:
154. You fondle your mouse.

 /// 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.

Raspunde prin e-mail lui