patch 7.4.1422
Problem: Error when reading fails uses wrong errno. Keeping channel open
after job stops results in test failing.
Solution: Move the error up. Add ch_job_killed.
diff --git a/src/channel.c b/src/channel.c
index 4a2b20c..03dbdc3 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -307,11 +307,14 @@
}
/*
- * Return TRUE if "channel" has a callback.
+ * Return TRUE if "channel" has a callback and the associated job wasn't
+ * killed.
*/
static int
-channel_has_callback(channel_T *channel)
+channel_still_useful(channel_T *channel)
{
+ if (channel->ch_job_killed && channel->ch_job == NULL)
+ return FALSE;
return channel->ch_callback != NULL
#ifdef CHANNEL_PIPES
|| channel->ch_part[PART_OUT].ch_callback != NULL
@@ -322,12 +325,13 @@
/*
* Close a channel and free all its resources if there is no further action
- * possible, there is no callback to be invoked.
+ * possible, there is no callback to be invoked or the associated job was
+ * killed.
*/
void
channel_may_free(channel_T *channel)
{
- if (!channel_has_callback(channel))
+ if (!channel_still_useful(channel))
channel_free(channel);
}
@@ -1774,6 +1778,12 @@
* -> channel_read()
*/
ch_errors(channel, "%s(): Cannot read", func);
+ if (len < 0)
+ {
+ ch_error(channel, "channel_read(): cannot read from channel");
+ PERROR(_("E896: read from channel"));
+ }
+
msg = channel->ch_part[part].ch_mode == MODE_RAW
|| channel->ch_part[part].ch_mode == MODE_NL
? DETACH_MSG_RAW : DETACH_MSG_JSON;
@@ -1785,12 +1795,6 @@
channel_close(channel, TRUE);
if (channel->ch_nb_close_cb != NULL)
(*channel->ch_nb_close_cb)();
-
- if (len < 0)
- {
- ch_error(channel, "channel_read(): cannot read from channel");
- PERROR(_("E896: read from channel"));
- }
}
#if defined(CH_HAS_GUI) && defined(FEAT_GUI_GTK)
@@ -2174,7 +2178,7 @@
while (channel != NULL)
{
- if (channel->ch_refcount == 0 && !channel_has_callback(channel))
+ if (channel->ch_refcount == 0 && !channel_still_useful(channel))
{
/* channel is no longer useful, free it */
channel_free(channel);