mirror of
https://github.com/vim/vim.git
synced 2025-07-24 10:45:12 -04:00
patch 7.4.1421
Problem: May free a channel when a callback may need to be invoked. Solution: Keep the channel when refcount is zero.
This commit is contained in:
parent
d2227a02b0
commit
c8dcbb12c5
@ -306,6 +306,31 @@ add_channel(void)
|
|||||||
return channel;
|
return channel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if "channel" has a callback.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
channel_has_callback(channel_T *channel)
|
||||||
|
{
|
||||||
|
return channel->ch_callback != NULL
|
||||||
|
#ifdef CHANNEL_PIPES
|
||||||
|
|| channel->ch_part[PART_OUT].ch_callback != NULL
|
||||||
|
|| channel->ch_part[PART_ERR].ch_callback != NULL
|
||||||
|
#endif
|
||||||
|
|| channel->ch_close_cb != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Close a channel and free all its resources if there is no further action
|
||||||
|
* possible, there is no callback to be invoked.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
channel_may_free(channel_T *channel)
|
||||||
|
{
|
||||||
|
if (!channel_has_callback(channel))
|
||||||
|
channel_free(channel);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Close a channel and free all its resources.
|
* Close a channel and free all its resources.
|
||||||
*/
|
*/
|
||||||
@ -1463,7 +1488,7 @@ channel_status(channel_T *channel)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Close channel "channel".
|
* Close channel "channel".
|
||||||
* This does not trigger the close callback.
|
* Trigger the close callback if "invoke_close_cb" is TRUE.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
channel_close(channel_T *channel, int invoke_close_cb)
|
channel_close(channel_T *channel, int invoke_close_cb)
|
||||||
@ -2149,6 +2174,14 @@ channel_parse_messages(void)
|
|||||||
|
|
||||||
while (channel != NULL)
|
while (channel != NULL)
|
||||||
{
|
{
|
||||||
|
if (channel->ch_refcount == 0 && !channel_has_callback(channel))
|
||||||
|
{
|
||||||
|
/* channel is no longer useful, free it */
|
||||||
|
channel_free(channel);
|
||||||
|
channel = first_channel;
|
||||||
|
part = PART_SOCK;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (channel->ch_part[part].ch_fd != INVALID_FD)
|
if (channel->ch_part[part].ch_fd != INVALID_FD)
|
||||||
{
|
{
|
||||||
/* Increase the refcount, in case the handler causes the channel
|
/* Increase the refcount, in case the handler causes the channel
|
||||||
|
@ -7745,8 +7745,8 @@ failret:
|
|||||||
|
|
||||||
#if defined(FEAT_CHANNEL) || defined(PROTO)
|
#if defined(FEAT_CHANNEL) || defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* Decrement the reference count on "channel" and free it when it goes down to
|
* Decrement the reference count on "channel" and maybe free it when it goes
|
||||||
* zero.
|
* down to zero. Don't free it if there is a pending action.
|
||||||
* Returns TRUE when the channel was freed.
|
* Returns TRUE when the channel was freed.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
@ -7754,7 +7754,7 @@ channel_unref(channel_T *channel)
|
|||||||
{
|
{
|
||||||
if (channel != NULL && --channel->ch_refcount <= 0)
|
if (channel != NULL && --channel->ch_refcount <= 0)
|
||||||
{
|
{
|
||||||
channel_free(channel);
|
channel_may_free(channel);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -4,6 +4,7 @@ int ch_log_active(void);
|
|||||||
void ch_log(channel_T *ch, char *msg);
|
void ch_log(channel_T *ch, char *msg);
|
||||||
void ch_logs(channel_T *ch, char *msg, char *name);
|
void ch_logs(channel_T *ch, char *msg, char *name);
|
||||||
channel_T *add_channel(void);
|
channel_T *add_channel(void);
|
||||||
|
void channel_may_free(channel_T *channel);
|
||||||
void channel_free(channel_T *channel);
|
void channel_free(channel_T *channel);
|
||||||
void channel_gui_register(channel_T *channel);
|
void channel_gui_register(channel_T *channel);
|
||||||
void channel_gui_register_all(void);
|
void channel_gui_register_all(void);
|
||||||
|
@ -748,6 +748,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1421,
|
||||||
/**/
|
/**/
|
||||||
1420,
|
1420,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user