diff options
author | Jean-Philippe Andre <jp.andre@samsung.com> | 2016-08-19 16:40:57 +0900 |
---|---|---|
committer | Jean-Philippe Andre <jp.andre@samsung.com> | 2016-08-26 10:18:01 +0900 |
commit | ef4859d5bdab3a9d8c5d7e2114c1d42bcc94f50f (patch) | |
tree | 21114975dd54d60370bec5dcc51e8c70c18c2bbd | |
parent | 57f0c850ec5011313b5ac2f3407b547ef149ac18 (diff) | |
download | efl-ef4859d5bdab3a9d8c5d7e2114c1d42bcc94f50f.tar.gz |
evas: Optimize out most callback call events
This sets a bit whenever a callback listener is added.
I couldn't get any profiling data easily (too small for
valgrind).
Note: This removes the proper refcounting on the "move"
event listeners. I believe this is not a problem as most times
the move_ref goes to 0, it is because the object is deleted.
Worst case, we just trigger a callback_call with no listeners.
This adds 32 bits to each evas object private data.
-rw-r--r-- | src/lib/evas/canvas/evas_callbacks.c | 27 | ||||
-rw-r--r-- | src/lib/evas/include/evas_inline.x | 6 | ||||
-rw-r--r-- | src/lib/evas/include/evas_private.h | 2 |
3 files changed, 26 insertions, 9 deletions
diff --git a/src/lib/evas/canvas/evas_callbacks.c b/src/lib/evas/canvas/evas_callbacks.c index 6c6f9026df..3e848b281b 100644 --- a/src/lib/evas/canvas/evas_callbacks.c +++ b/src/lib/evas/canvas/evas_callbacks.c @@ -73,6 +73,20 @@ DEFINE_EVAS_CALLBACKS(_legacy_evas_callback_table, EVAS_CALLBACK_LAST, EVAS_CANVAS_EVENT_AXIS_UPDATE, EVAS_CANVAS_EVENT_VIEWPORT_RESIZE ); +static inline Evas_Callback_Type +_legacy_evas_callback_type(const Efl_Event_Description *desc) +{ + Evas_Callback_Type type; + + for (type = 0; type < EVAS_CALLBACK_LAST; type++) + { + if (_legacy_evas_callback_table(type) == desc) + return type; + } + + return EVAS_CALLBACK_LAST; +} + typedef struct { EINA_INLIST; @@ -288,7 +302,7 @@ evas_object_event_callback_call(Evas_Object *eo_obj, Evas_Object_Protected_Data _evas_walk(e); - if ((type == EVAS_CALLBACK_MOVE) && (obj->move_ref == 0)) + if (!_evas_object_callback_has_by_type(obj, type)) goto nothing_here; if ((type == EVAS_CALLBACK_MOUSE_DOWN) || (type == EVAS_CALLBACK_MOUSE_UP)) @@ -315,7 +329,7 @@ evas_object_event_callback_call(Evas_Object *eo_obj, Evas_Object_Protected_Data if ((type == EVAS_CALLBACK_MOUSE_DOWN) || (type == EVAS_CALLBACK_MOUSE_UP)) efl_event_pointer_button_flags_set(efl_event_info, flags); - nothing_here: +nothing_here: if (!obj->no_propagate) { if ((obj->smart.parent) && (type != EVAS_CALLBACK_FREE) && @@ -593,6 +607,7 @@ _check_event_catcher_add(void *data, const Eo_Event *event) { const Efl_Callback_Array_Item *array = event->info; Evas_Object_Protected_Data *obj = data; + Evas_Callback_Type type = EVAS_CALLBACK_LAST; int i; for (i = 0; array[i].desc != NULL; i++) @@ -605,9 +620,9 @@ _check_event_catcher_add(void *data, const Eo_Event *event) INF("Registering an animator tick on canvas %p for object %p.", obj->layer->evas->evas, obj->object); } - else if (array[i].desc == EFL_GFX_EVENT_MOVE) + else if ((type = _legacy_evas_callback_type(array[i].desc)) != EVAS_CALLBACK_LAST) { - obj->move_ref++; + obj->callback_mask |= (1 << type); } } } @@ -629,10 +644,6 @@ _check_event_catcher_del(void *data, const Eo_Event *event) INF("Unregistering an animator tick on canvas %p for object %p.", obj->layer->evas->evas, obj->object); } - else if (array[i].desc == EFL_GFX_EVENT_MOVE) - { - obj->move_ref--; - } } } diff --git a/src/lib/evas/include/evas_inline.x b/src/lib/evas/include/evas_inline.x index 1906fbc208..d7c94db49a 100644 --- a/src/lib/evas/include/evas_inline.x +++ b/src/lib/evas/include/evas_inline.x @@ -22,6 +22,12 @@ _evas_object_event_new(void) return (++_evas_event_counter); } +static inline Eina_Bool +_evas_object_callback_has_by_type(Evas_Object_Protected_Data *obj, Evas_Callback_Type type) +{ + return (obj->callback_mask & (1 << type)) != 0; +} + static inline int evas_object_was_visible(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) { diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 5964a66f1c..ceac5872ad 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1124,7 +1124,7 @@ struct _Evas_Object_Protected_Data unsigned int ref; unsigned int animator_ref; - unsigned int move_ref; + uint64_t callback_mask; unsigned char delete_me; |