zmike pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=9d428c610da04846e9c03a0cd83e16322b1ab84c

commit 9d428c610da04846e9c03a0cd83e16322b1ab84c
Author: Marcel Hollerbach <[email protected]>
Date:   Thu Jan 2 09:35:31 2020 -0500

    evas: protect against leaking callbacks
    
    Summary:
    when someone accidently does not clean up all his animation callbacks,
    we might end up with a lot of errors on console, as we keep delivering
    tick events to a dead object.
    
    Reviewers: zmike, cedric, segfaultxavi
    
    Reviewed By: zmike
    
    Subscribers: #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D10998
---
 src/lib/evas/canvas/evas_callbacks.c   | 7 +++++++
 src/lib/evas/canvas/evas_object_main.c | 2 +-
 src/lib/evas/include/evas_private.h    | 1 +
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/lib/evas/canvas/evas_callbacks.c 
b/src/lib/evas/canvas/evas_callbacks.c
index d9aac154f8..14ab286acd 100644
--- a/src/lib/evas/canvas/evas_callbacks.c
+++ b/src/lib/evas/canvas/evas_callbacks.c
@@ -872,3 +872,10 @@ evas_object_callbacks_event_catcher_del(Eo *eo_obj 
EINA_UNUSED, Evas_Object_Prot
      }
 }
 
+void
+evas_object_callbacks_shutdown(Eo *eo_obj EINA_UNUSED, 
Evas_Object_Protected_Data *obj)
+{
+   if (obj->animator_ref > 0)
+     efl_event_callback_del(obj->layer->evas->evas, 
EFL_CANVAS_OBJECT_EVENT_ANIMATOR_TICK, _animator_repeater, obj);
+   obj->animator_ref = 0;
+}
diff --git a/src/lib/evas/canvas/evas_object_main.c 
b/src/lib/evas/canvas/evas_object_main.c
index 6b78b581e7..f01ab01e41 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -1179,7 +1179,7 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, 
Evas_Object_Protected_Data
 end:
    evas_object_event_callback_all_del(eo_obj);
    evas_object_event_callback_cleanup(eo_obj);
-
+   evas_object_callbacks_shutdown(eo_obj, obj);
    efl_destructor(efl_super(eo_obj, MY_CLASS));
 }
 
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 20a04959f8..aacbe016f8 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1623,6 +1623,7 @@ void evas_event_callback_call(Evas *e, Evas_Callback_Type 
type, void *event_info
 void evas_object_callbacks_finalized(Eo *eo_obj EINA_UNUSED, 
Evas_Object_Protected_Data *obj);
 void evas_object_callbacks_event_catcher_add(Eo *eo_obj EINA_UNUSED, 
Evas_Object_Protected_Data *obj, const Efl_Callback_Array_Item *array);
 void evas_object_callbacks_event_catcher_del(Eo *eo_obj EINA_UNUSED, 
Evas_Object_Protected_Data *obj, const Efl_Callback_Array_Item *array);
+void evas_object_callbacks_shutdown(Eo *eo_obj EINA_UNUSED, 
Evas_Object_Protected_Data *obj);
 
 void evas_object_event_callback_call(Evas_Object *obj, 
Evas_Object_Protected_Data *pd, Evas_Callback_Type type, void *event_info, int 
event_id, const Efl_Event_Description *efl_event_desc);
 Eina_List *evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, 
int y);

-- 


Reply via email to