Pontus Leitzler wrote:
> Just to summarize: > - channel_read() reads 63 bytes and calls channel_save() > - channel_save() saves those to a new node->rq_buffer at the end of channel= > head > > To convert it to JSON someone must call channel_parse_json(), and it can be= > either from channel_read_json_block() or may_invoke_callback(). > My logs shows that it is via may_invoke_callback() until it hangs. > > - may_invoke_callback() is called from channel_parse_messages() > - channel_parse_messages() is called from parse_queued_messages() > - parse_queued_messages() is called from inchar_loop() > > But, since channel_parse_json() haven't been called yet for the latest mess= > age, inchar_loop() will allow a wait_func()-call with wait_time =3D=3D -1 (= > that leads to RealWaitForChar() NULL). > > To avoid it, inchar_loop() calls channel_any_readahead(), but it will retur= > n FALSE since the messages haven't been parsed to JSON yet and it only chec= > ks the JSON queue in JSON mode. > > So I guess the solution to this is to either let channel_any_readahead() ca= > ll channel_peek() in JSON mode as well, or add a call to channel_parse_json= > () somewhere to ensure that the incoming message has been parsed so that ch= > annel_any_readahead() returns TRUE in JSON-mode (?). > > I'm sorry if my explanation is messy, it's probably a combination of me not= > being familiar with the code base as well as not being native English :) Thanks for the digging and explanation. channel_has_readahead() is called in a few places, checking if there is something ready to read. But it doesn't use any received text on a JSON channel if it hasn't been parsed yet. It looks like calling channel_parse_json() in channel_has_readahead() would be the right thing to do. Please try if this patch fixes your problem: --- prev/src/channel.c 2019-06-24 00:43:31.463691826 +0200 +++ channel.c 2019-06-28 04:41:25.767304149 +0200 @@ -2850,10 +2850,13 @@ if (ch_mode == MODE_JSON || ch_mode == MODE_JS) { - jsonq_T *head = &channel->ch_part[part].ch_json_head; - jsonq_T *item = head->jq_next; + jsonq_T *head; - return item != NULL; + // Parse json from readahead before checking the queue. + channel_parse_json(channel, part); + + head = &channel->ch_part[part].ch_json_head; + return head->jq_next != NULL; } return channel_peek(channel, part) != NULL; } -- The greatest lies of all time: (1) The check is in the mail. (2) We have a really challenging assignment for you. (3) I love you. (4) All bugs have been fixed. (5) This won't hurt a bit. (6) Honey, I just need to debug this program and be home in 5 minutes. (7) I have just sent you an e-mail about that. (8) Of course I'll respect you in the morning. (9) I'm from the government, and I'm here to help you. /// 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. To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/201906280258.x5S2w16o028398%40masaka.moolenaar.net. For more options, visit https://groups.google.com/d/optout.