To: vim_dev@googlegroups.com Subject: Patch 8.2.4830 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4830 Problem: Possible endless loop if there is unused typahead. Solution: Only loop when the typeahead changed. Files: src/channel.c *** ../vim-8.2.4829/src/channel.c 2022-04-19 10:25:04.249373674 +0100 --- src/channel.c 2022-04-26 18:51:40.785227454 +0100 *************** *** 2029,2035 **** /* * Collapses the first and second buffer for "channel"/"part". ! * Returns FAIL if that is not possible. * When "want_nl" is TRUE collapse more buffers until a NL is found. * When the channel part mode is "lsp", collapse all the buffers as the http * header and the JSON content can be present in multiple buffers. --- 2029,2035 ---- /* * Collapses the first and second buffer for "channel"/"part". ! * Returns FAIL if nothing was done. * When "want_nl" is TRUE collapse more buffers until a NL is found. * When the channel part mode is "lsp", collapse all the buffers as the http * header and the JSON content can be present in multiple buffers. *************** *** 2957,2962 **** --- 2957,2973 ---- } /* + * Return TRUE if for "channel" / "part" ch_json_head should be used. + */ + static int + channel_use_json_head(channel_T *channel, ch_part_T part) + { + ch_mode_T ch_mode = channel->ch_part[part].ch_mode; + + return ch_mode == MODE_JSON || ch_mode == MODE_JS || ch_mode == MODE_LSP; + } + + /* * Invoke a callback for "channel"/"part" if needed. * This does not redraw but sets channel_need_redraw when redraw is needed. * Return TRUE when a message was handled, there might be another one. *************** *** 3002,3008 **** buffer = NULL; } ! if (ch_mode == MODE_JSON || ch_mode == MODE_JS || ch_mode == MODE_LSP) { listitem_T *item; int argc = 0; --- 3013,3019 ---- buffer = NULL; } ! if (channel_use_json_head(channel, part)) { listitem_T *item; int argc = 0; *************** *** 3248,3261 **** } /* ! * Return TRUE if "channel" has JSON or other typeahead. */ ! static int ! channel_has_readahead(channel_T *channel, ch_part_T part) { ! ch_mode_T ch_mode = channel->ch_part[part].ch_mode; ! ! if (ch_mode == MODE_JSON || ch_mode == MODE_JS || ch_mode == MODE_LSP) { jsonq_T *head = &channel->ch_part[part].ch_json_head; --- 3259,3271 ---- } /* ! * Return a pointer indicating the readahead. Can only be compared between ! * calls. Returns NULL if there is no readahead. */ ! static void * ! channel_readahead_pointer(channel_T *channel, ch_part_T part) { ! if (channel_use_json_head(channel, part)) { jsonq_T *head = &channel->ch_part[part].ch_json_head; *************** *** 3264,3272 **** // process. channel_parse_json(channel, part); ! return head->jq_next != NULL; } ! return channel_peek(channel, part) != NULL; } /* --- 3274,3291 ---- // process. channel_parse_json(channel, part); ! return head->jq_next; } ! return channel_peek(channel, part); ! } ! ! /* ! * Return TRUE if "channel" has JSON or other typeahead. ! */ ! static int ! channel_has_readahead(channel_T *channel, ch_part_T part) ! { ! return channel_readahead_pointer(channel, part) != NULL; } /* *************** *** 4013,4026 **** if (!more) { // Handle any other messages in the queue. If done some more // messages may have arrived. if (channel_parse_messages()) continue; // channel_parse_messages() may fill the queue with new data to ! // process. ! if (channel_has_readahead(channel, part)) continue; // Wait for up to the timeout. If there was an incomplete message --- 4032,4050 ---- if (!more) { + void *prev_readahead_ptr = channel_readahead_pointer(channel, part); + void *readahead_ptr; + // Handle any other messages in the queue. If done some more // messages may have arrived. if (channel_parse_messages()) continue; // channel_parse_messages() may fill the queue with new data to ! // process. Only loop when the readahead changed, otherwise we ! // would busy-loop. ! readahead_ptr = channel_readahead_pointer(channel, part); ! if (readahead_ptr != NULL && readahead_ptr != prev_readahead_ptr) continue; // Wait for up to the timeout. If there was an incomplete message *** ../vim-8.2.4829/src/version.c 2022-04-26 12:51:01.078682252 +0100 --- src/version.c 2022-04-26 18:48:16.749347284 +0100 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 4830, /**/ -- hundred-and-one symptoms of being an internet addict: 61. Your best friends know your e-mail address, but neither your phone number nor the address where you live. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///