Daniel Hahler wrote:

> > Thanks, this is useful.  Now we need to find out why we see an error or
> > nothing to read, while reading the pipe/socket should give us the
> > output.  Adding some ch_logs() calls in channel_wait() could help
> > pinpoint it.
> 
> Sorry, I have not patched/debugged Vim, but want to add some findings while 
> trying to make the async support for Vim work in Neomake.
> 
> 
> I think this might also be related to channels only being read from
> when Vim waits for user input, and that the closing callback is being
> invoked nonetheless - but input is discarded?!
> 
> The following will not collect the line (to be run with `vim -Nu t.vim`):
> 
> ```
> call ch_logfile('/tmp/job.log')
> 
> let g:lines = []
> function Callback(channel, data)
>   echom "CALLBACK" string(a:channel) string(a:data)
>   echom "\n"
>   let g:lines += [a:data]
> endfunction
> 
> function Close_cb(channel)
>   let g:lines += ['closed']
>   echom "CLOSE" string(a:channel)
>   echom "\n"
> endfunction
> 
> function Start(nr)
>   return job_start(['sh', '-c', 'echo '.a:nr], {
>         \ 'callback': 'Callback',
>         \ 'close_cb': 'Close_cb',
>         \ })
> endfunction
> 
> call Start(1)
> sleep 1
> echom "lines" string(g:lines)
> ```

When I run this, the output is:
lines []
Press ENTER or type command to continueCALLBACK channel 0 closed '1'^@CLOSE 
channel 0 closed^@

And g:lines contains: ['1', 'closed']

So the output is read correctly, but only after "sleep 1".


> I can make it work when using `call input('continue?')` instead of the sleep.

What do you mean with "can make it work"?

> Is there another workaround / command that can be used to read from
> all channels?
> 
>     Callbacks are only called at a "safe" moment, usually when Vim
>     is waiting for the user to type a character.  Vim does not use
>     multi-threading.
> 
> The workaround I've found to make the tests in Neomake work is appending a 
> "sleep .1" to the job's (shell) command: this makes it apparently stay long 
> enough so that output gets handled.  But I do not think this is a good 
> workaround after all, and it does not work when trying to call "nonexistent".
> 
> 
> For starters: what about handling "sleep" like "call input()"?

Yes, I thought that already happened, apparently not.

> btw: I've found that `ch_read(job, {'timeout': 0})` can be used to read from 
> the channel, but that does not trigger the callbacks, and the following will 
> even deadlock Vim (100%), apparently in "ch_read":
> 
> ```
> let job = Start(1)
> while 1
>   let job_info = job_info(job)
>   if job_info['status'] == 'dead'
>     let data = ch_read(job, {'timeout': 0})
>     echom "READ DATA" string(data)
>   endif
>   echom string(job_info)
>   echom "."
>   sleep 10m
> endwhile
> echom "lines" string(g:lines)
> ```
> 
> The log for this is:
>   0.000040 : Starting job: sh  -c  echo 1
>   0.000076 on 0: Created channel
>   0.012068 : looking for messages on channels
>   0.012367 on 0: Job ended
>   0.012836 on 0: Blocking NL read, timeout: 0 msec
>   0.012994 RECV on 0: '1
> '
>   0.013014 on 0: Returning 1 bytes
>   0.023729 : looking for messages on channels
>   0.024069 on 0: Blocking NL read, timeout: 0 msec
>   0.024097 ERR on 0: channel_read_block(): Cannot read from channel, will 
> close it soon
> 
> 
> Sorry for the unstructured comments, but it appears to be really buggy
> in this regard.

Mixing callbacks with reading with ch_read() creates a race condition,
better not do that.

-- 
    [clop clop]
ARTHUR:  Old woman!
DENNIS:  Man!
ARTHUR:  Man, sorry.  What knight lives in that castle over there?
DENNIS:  I'm thirty seven.
ARTHUR:  What?
DENNIS:  I'm thirty seven -- I'm not old!
                                  The Quest for the Holy Grail (Monty Python)

 /// Bram Moolenaar -- b...@moolenaar.net -- 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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui