Patch 7.4.2304
Problem:    In a timer callback the timer itself can't be found or stopped.
            (Thinca)
Solution:   Do not remove the timer from the list, remember whether it was
            freed.
Files:      src/ex_cmds2.c, src/testdir/test_timers.vim


*** ../vim-7.4.2303/src/ex_cmds2.c      2016-08-29 22:48:12.125106388 +0200
--- src/ex_cmds2.c      2016-09-01 21:09:54.394328936 +0200
***************
*** 1090,1095 ****
--- 1090,1098 ----
  static timer_T        *first_timer = NULL;
  static int    last_timer_id = 0;
  
+ static timer_T        *current_timer = NULL;
+ static int    free_current_timer = FALSE;
+ 
  /*
   * Insert a timer in the list of timers.
   */
***************
*** 1121,1128 ****
      static void
  free_timer(timer_T *timer)
  {
!     free_callback(timer->tr_callback, timer->tr_partial);
!     vim_free(timer);
  }
  
  /*
--- 1124,1136 ----
      static void
  free_timer(timer_T *timer)
  {
!     if (timer == current_timer)
!       free_current_timer = TRUE;
!     else
!     {
!       free_callback(timer->tr_callback, timer->tr_partial);
!       vim_free(timer);
!     }
  }
  
  /*
***************
*** 1200,1217 ****
  # endif
            if (this_due <= 1)
            {
!               remove_timer(timer);
                timer_callback(timer);
                did_one = TRUE;
!               if (timer->tr_repeat != 0)
                {
                    profile_setlimit(timer->tr_interval, &timer->tr_due);
                    if (timer->tr_repeat > 0)
                        --timer->tr_repeat;
-                   insert_timer(timer);
                }
                else
                    free_timer(timer);
                /* the callback may do anything, start all over */
                break;
            }
--- 1208,1230 ----
  # endif
            if (this_due <= 1)
            {
!               current_timer = timer;
!               free_current_timer = FALSE;
                timer_callback(timer);
+               current_timer = NULL;
+ 
                did_one = TRUE;
!               if (timer->tr_repeat != 0 && !free_current_timer)
                {
                    profile_setlimit(timer->tr_interval, &timer->tr_due);
                    if (timer->tr_repeat > 0)
                        --timer->tr_repeat;
                }
                else
+               {
                    free_timer(timer);
+                   remove_timer(timer);
+               }
                /* the callback may do anything, start all over */
                break;
            }
*** ../vim-7.4.2303/src/testdir/test_timers.vim 2016-08-28 16:06:01.407721837 
+0200
--- src/testdir/test_timers.vim 2016-09-01 21:26:08.546370746 +0200
***************
*** 128,131 ****
--- 128,146 ----
    endif
  endfunc
  
+ func StopMyself(timer)
+   let g:called += 1
+   if g:called == 2
+     call timer_stop(a:timer)
+   endif
+ endfunc
+ 
+ func Test_delete_myself()
+   let g:called = 0
+   let t = timer_start(10, 'StopMyself', {'repeat': -1})
+   call WaitFor('g:called == 2')
+   call assert_equal(2, g:called)
+   call assert_equal([], timer_info(t))
+ endfunc
+ 
  " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-7.4.2303/src/version.c       2016-09-01 20:58:17.640011363 +0200
--- src/version.c       2016-09-01 21:09:04.010740607 +0200
***************
*** 765,766 ****
--- 765,768 ----
  {   /* Add new patch number below this line */
+ /**/
+     2304,
  /**/


-- 
hundred-and-one symptoms of being an internet addict:
127. You bring your laptop and cellular phone to church.

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