Patch 7.4.1827
Problem:    No error when invoking a callback when it's not safe.
Solution:   Add an error message.  Avoid the error when freeing a channel.
Files:      src/structs.h, src/channel.c


*** ../vim-7.4.1826/src/structs.h       2016-05-09 17:20:08.492312468 +0200
--- src/structs.h       2016-05-09 17:46:44.442422193 +0200
***************
*** 1419,1424 ****
--- 1419,1426 ----
      int               ch_to_be_closed; /* When TRUE reading or writing failed 
and
                                  * the channel must be closed when it's safe
                                  * to invoke callbacks. */
+     int               ch_to_be_freed; /* When TRUE channel must be freed when 
it's
+                                * safe to invoke callbacks. */
      int               ch_error;       /* When TRUE an error was reported.  
Avoids
                                 * giving pages full of error messages when
                                 * the other side has exited, only mention the
*** ../vim-7.4.1826/src/channel.c       2016-05-09 17:20:08.496312424 +0200
--- src/channel.c       2016-05-09 17:51:57.102860175 +0200
***************
*** 59,64 ****
--- 59,67 ----
  /* Whether a redraw is needed for appending a line to a buffer. */
  static int channel_need_redraw = FALSE;
  
+ /* Whether we are inside channel_parse_messages() or another situation where 
it
+  * is safe to invoke callbacks. */
+ static int safe_to_invoke_callback = 0;
  
  #ifdef WIN32
      static int
***************
*** 403,410 ****
  {
      if (!in_free_unref_items)
      {
!       channel_free_contents(channel);
!       channel_free_channel(channel);
      }
  }
  
--- 406,420 ----
  {
      if (!in_free_unref_items)
      {
!       if (safe_to_invoke_callback == 0)
!       {
!           channel->ch_to_be_freed = TRUE;
!       }
!       else
!       {
!           channel_free_contents(channel);
!           channel_free_channel(channel);
!       }
      }
  }
  
***************
*** 444,449 ****
--- 454,463 ----
      int               did_free = FALSE;
      channel_T *ch;
  
+     /* This is invoked from the garbage collector, which only runs at a safe
+      * point. */
+     ++safe_to_invoke_callback;
+ 
      for (ch = first_channel; ch != NULL; ch = ch->ch_next)
        if (!channel_still_useful(ch)
                                 && (ch->ch_copyID & mask) != (copyID & mask))
***************
*** 453,458 ****
--- 467,474 ----
            channel_free_contents(ch);
            did_free = TRUE;
        }
+ 
+     --safe_to_invoke_callback;
      return did_free;
  }
  
***************
*** 1450,1455 ****
--- 1466,1474 ----
      typval_T  rettv;
      int               dummy;
  
+     if (safe_to_invoke_callback == 0)
+       EMSG("INTERNAL: Invoking callback when it is not safe");
+ 
      argv[0].v_type = VAR_CHANNEL;
      argv[0].vval.v_channel = channel;
  
***************
*** 3515,3520 ****
--- 3534,3541 ----
      int               r;
      int               part = PART_SOCK;
  
+     ++safe_to_invoke_callback;
+ 
      /* Only do this message when another message was given, otherwise we get
       * lots of them. */
      if (did_log_msg)
***************
*** 3532,3537 ****
--- 3553,3565 ----
            channel = first_channel;
            continue;
        }
+       if (channel->ch_to_be_freed)
+       {
+           channel_free(channel);
+           /* channel has been freed, start over */
+           channel = first_channel;
+           continue;
+       }
        if (channel->ch_refcount == 0 && !channel_still_useful(channel))
        {
            /* channel is no longer useful, free it */
***************
*** 3572,3577 ****
--- 3600,3607 ----
        redraw_after_callback();
      }
  
+     --safe_to_invoke_callback;
+ 
      return ret;
  }
  
*** ../vim-7.4.1826/src/version.c       2016-05-09 17:20:08.496312424 +0200
--- src/version.c       2016-05-09 17:37:26.784701922 +0200
***************
*** 755,756 ****
--- 755,758 ----
  {   /* Add new patch number below this line */
+ /**/
+     1827,
  /**/

-- 
Computers make very fast, very accurate, mistakes.

 /// 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.

Raspunde prin e-mail lui