Patch 7.4.1814
Problem: A channel may be garbage collected while it's still being used by
a job. (James McCoy)
Solution: Mark the channel as used if the job is still used. Do the same
for channels that are still used.
Files: src/eval.c, src/channel.c, src/proto/channel.pro
*** ../vim-7.4.1813/src/eval.c 2016-04-30 18:06:47.114331342 +0200
--- src/eval.c 2016-05-01 13:55:49.258550849 +0200
***************
*** 7024,7029 ****
--- 7024,7030 ----
#ifdef FEAT_JOB_CHANNEL
abort = abort || set_ref_in_channel(copyID);
+ abort = abort || set_ref_in_job(copyID);
#endif
#ifdef FEAT_NETBEANS_INTG
abort = abort || set_ref_in_nb_channel(copyID);
*** ../vim-7.4.1813/src/channel.c 2016-04-30 17:06:27.167577887 +0200
--- src/channel.c 2016-05-01 14:18:35.802501694 +0200
***************
*** 3553,3580 ****
{
int abort = FALSE;
channel_T *channel;
! int part;
for (channel = first_channel; channel != NULL; channel = channel->ch_next)
! {
! for (part = PART_SOCK; part < PART_IN; ++part)
{
! jsonq_T *head = &channel->ch_part[part].ch_json_head;
! jsonq_T *item = head->jq_next;
!
! while (item != NULL)
! {
! list_T *l = item->jq_value->vval.v_list;
!
! if (l->lv_copyID != copyID)
! {
! l->lv_copyID = copyID;
! abort = abort || set_ref_in_list(l, copyID, NULL);
! }
! item = item->jq_next;
! }
}
- }
return abort;
}
--- 3553,3567 ----
{
int abort = FALSE;
channel_T *channel;
! typval_T tv;
for (channel = first_channel; channel != NULL; channel = channel->ch_next)
! if (channel_still_useful(channel))
{
! tv.v_type = VAR_CHANNEL;
! tv.vval.v_channel = channel;
! abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL);
}
return abort;
}
***************
*** 4092,4097 ****
--- 4079,4104 ----
&& channel_still_useful(job->jv_channel)));
}
+ /*
+ * Mark references in jobs that are still useful.
+ */
+ int
+ set_ref_in_job(int copyID)
+ {
+ int abort = FALSE;
+ job_T *job;
+ typval_T tv;
+
+ for (job = first_job; job != NULL; job = job->jv_next)
+ if (job_still_useful(job))
+ {
+ tv.v_type = VAR_JOB;
+ tv.vval.v_job = job;
+ abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL);
+ }
+ return abort;
+ }
+
void
job_unref(job_T *job)
{
*** ../vim-7.4.1813/src/proto/channel.pro 2016-04-26 19:01:00.957118797
+0200
--- src/proto/channel.pro 2016-05-01 14:02:55.945529047 +0200
***************
*** 49,54 ****
--- 49,55 ----
void free_job_options(jobopt_T *opt);
int get_job_options(typval_T *tv, jobopt_T *opt, int supported);
channel_T *get_channel_arg(typval_T *tv, int check_open, int reading, int
part);
+ int set_ref_in_job(int copyID);
void job_unref(job_T *job);
int free_unused_jobs_contents(int copyID, int mask);
void free_unused_jobs(int copyID, int mask);
*** ../vim-7.4.1813/src/version.c 2016-05-01 13:28:34.517588215 +0200
--- src/version.c 2016-05-01 13:56:54.989776375 +0200
***************
*** 755,756 ****
--- 755,758 ----
{ /* Add new patch number below this line */
+ /**/
+ 1814,
/**/
--
Sometimes I think the surest sign that intelligent life exists elsewhere
in the universe is that none of it has tried to contact us. (Calvin)
/// Bram Moolenaar -- [email protected] -- 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 [email protected].
For more options, visit https://groups.google.com/d/optout.