To: vim_dev@googlegroups.com Subject: Patch 9.0.0361 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0361 Problem: Removing a listener may result in a memory leak and remove subsequent listerns. Solution: Init the "prev" pointer only once. (Yegappan Lakshmanan, closes #11039) Files: src/change.c, src/testdir/test_listener.vim *** ../vim-9.0.0360/src/change.c 2022-08-25 15:11:11.396084550 +0100 --- src/change.c 2022-09-02 17:06:43.597857183 +0100 *************** *** 362,367 **** --- 362,368 ---- int save_updating_screen = updating_screen; static int recursive = FALSE; listener_T *next; + listener_T *prev; if (buf->b_recorded_changes == NULL // nothing changed || buf->b_listener == NULL // no listeners *************** *** 406,415 **** } // If f_listener_remove() was called may have to remove a listener now. for (lnr = buf->b_listener; lnr != NULL; lnr = next) { - listener_T *prev = NULL; - next = lnr->lr_next; if (lnr->lr_id == 0) remove_listener(buf, lnr, prev); --- 407,415 ---- } // If f_listener_remove() was called may have to remove a listener now. + prev = NULL; for (lnr = buf->b_listener; lnr != NULL; lnr = next) { next = lnr->lr_next; if (lnr->lr_id == 0) remove_listener(buf, lnr, prev); *** ../vim-9.0.0360/src/testdir/test_listener.vim 2022-02-14 14:48:37.000000000 +0000 --- src/testdir/test_listener.vim 2022-09-02 17:06:43.597857183 +0100 *************** *** 387,392 **** --- 387,423 ---- unlet g:listener_called endfunc + " When multiple listeners are registered, remove one listener and verify the + " other listener is still called + func Test_remove_one_listener_in_callback() + new + let g:listener1_called = 0 + let g:listener2_called = 0 + let s:ID1 = listener_add('Listener1') + let s:ID2 = listener_add('Listener2') + func Listener1(...) + call listener_remove(s:ID1) + let g:listener1_called += 1 + endfunc + func Listener2(...) + let g:listener2_called += 1 + endfunc + call setline(1, ['foo']) + call feedkeys("~", 'xt') + call listener_flush() + call feedkeys("~", 'xt') + call listener_flush() + call assert_equal(1, g:listener1_called) + call assert_equal(2, g:listener2_called) + + call listener_remove(s:ID2) + bwipe! + delfunc Listener1 + delfunc Listener2 + unlet g:listener1_called + unlet g:listener2_called + endfunc + func Test_no_change_for_empty_undo() new let text = ['some word here', 'second line'] *** ../vim-9.0.0360/src/version.c 2022-09-02 16:47:12.915042726 +0100 --- src/version.c 2022-09-02 17:08:07.677754374 +0100 *************** *** 709,710 **** --- 709,712 ---- { /* Add new patch number below this line */ + /**/ + 361, /**/ -- Team-building exercises come in many forms but they all trace their roots back to the prison system. In your typical team-building exercise the employees are subjected to a variety of unpleasant situations until they become either a cohesive team or a ring of car jackers. (Scott Adams - The Dilbert principle) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///