@@ -306,6 +306,31 @@ add_channel(void)
306306 return channel ;
307307}
308308
309+ /*
310+ * Return TRUE if "channel" has a callback.
311+ */
312+ static int
313+ channel_has_callback (channel_T * channel )
314+ {
315+ return channel -> ch_callback != NULL
316+ #ifdef CHANNEL_PIPES
317+ || channel -> ch_part [PART_OUT ].ch_callback != NULL
318+ || channel -> ch_part [PART_ERR ].ch_callback != NULL
319+ #endif
320+ || channel -> ch_close_cb != NULL ;
321+ }
322+
323+ /*
324+ * Close a channel and free all its resources if there is no further action
325+ * possible, there is no callback to be invoked.
326+ */
327+ void
328+ channel_may_free (channel_T * channel )
329+ {
330+ if (!channel_has_callback (channel ))
331+ channel_free (channel );
332+ }
333+
309334/*
310335 * Close a channel and free all its resources.
311336 */
@@ -1463,7 +1488,7 @@ channel_status(channel_T *channel)
14631488
14641489/*
14651490 * Close channel "channel".
1466- * This does not trigger the close callback.
1491+ * Trigger the close callback if "invoke_close_cb" is TRUE .
14671492 */
14681493 void
14691494channel_close (channel_T * channel , int invoke_close_cb )
@@ -2149,6 +2174,14 @@ channel_parse_messages(void)
21492174
21502175 while (channel != NULL )
21512176 {
2177+ if (channel -> ch_refcount == 0 && !channel_has_callback (channel ))
2178+ {
2179+ /* channel is no longer useful, free it */
2180+ channel_free (channel );
2181+ channel = first_channel ;
2182+ part = PART_SOCK ;
2183+ continue ;
2184+ }
21522185 if (channel -> ch_part [part ].ch_fd != INVALID_FD )
21532186 {
21542187 /* Increase the refcount, in case the handler causes the channel
0 commit comments