bu5hm4n pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=ff14c84fcb01d69323ea6e6547ec7d9f0c1fb756
commit ff14c84fcb01d69323ea6e6547ec7d9f0c1fb756 Author: Cedric Bail <cedric.b...@free.fr> Date: Fri Oct 18 09:24:47 2019 -0700 eo: add debug ability to detect long chain of event handler. Reviewed-by: Marcel Hollerbach <m...@marcel-hollerbach.de> Differential Revision: https://phab.enlightenment.org/D10484 --- src/lib/eo/eo_base_class.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c index a159c656f6..39da0e8538 100644 --- a/src/lib/eo/eo_base_class.c +++ b/src/lib/eo/eo_base_class.c @@ -1492,6 +1492,29 @@ _efl_object_event_callback_priority_add(Eo *obj, Efl_Object_Data *pd, const Efl_Callback_Array_Item_Full arr[] = { {desc, priority, func, (void *)user_data}, {NULL, 0, NULL, NULL}}; Eo_Callback_Description *cb = _eo_callback_new(); +#ifdef EO_DEBUG + unsigned int idx, r = 0, entries = 0; + + for (idx = pd->callbacks_count ; idx > 0; idx--) + { + Eo_Callback_Description **cb; + + cb = pd->callbacks + idx - 1; + if (!(*cb)->func_array) + { + if (((*cb)->items.item.desc == desc) && + ((*cb)->items.item.func == func) && + ((*cb)->priority == priority) && + ((*cb)->generation == _efl_event_generation(pd))) + r++; + } + entries++; + } + if (r > 1) INF("Object '%s' got %i callback with event '%s' registered.", + efl_debug_name_get(obj), r, desc->name); + if (entries > 10) INF("Object '%s' got %i callbacks.", + efl_debug_name_get(obj), entries); +#endif // very unlikely so improve l1 instr cache by using goto if (EINA_UNLIKELY(!cb || !desc || !func)) goto err; @@ -1582,6 +1605,7 @@ _efl_object_event_callback_array_priority_add(Eo *obj, Efl_Object_Data *pd, Efl_Callback_Array_Item_Full *ev_array; #ifdef EO_DEBUG const Efl_Callback_Array_Item *prev; + unsigned int idx, r = 0, entries = 0; #endif // very unlikely so improve l1 instr cache by using goto @@ -1606,6 +1630,40 @@ _efl_object_event_callback_array_priority_add(Eo *obj, Efl_Object_Data *pd, cb->generation = _efl_event_generation(pd); if (!!cb->generation) pd->need_cleaning = EINA_TRUE; +#ifdef EO_DEBUG + for (idx = pd->callbacks_count ; idx > 0; idx--) + { + Eo_Callback_Description **cb; + + cb = pd->callbacks + idx - 1; + if ((*cb)->func_array) + { + if (((*cb)->items.item_array == array) && + ((*cb)->priority == priority) && + ((*cb)->generation == _efl_event_generation(pd))) + r++; + } + entries++; + } + if (r > 1) + { + Eina_Strbuf *buf = eina_strbuf_new(); + Eina_Bool first = EINA_TRUE; + + for (it = array; it->func; it++) + { + if (first) eina_strbuf_append(buf, it->desc->name); + else eina_strbuf_append_printf(buf, ", %s", it->desc->name); + first = EINA_FALSE; + } + INF("Object '%s' got %i callback with events array %s registered.", + efl_debug_name_get(obj), r, eina_strbuf_string_get(buf)); + eina_strbuf_free(buf); + } + if (entries > 10) INF("Object '%s' got %i callbacks.", + efl_debug_name_get(obj), entries); +#endif + _eo_callbacks_sorted_insert(pd, cb); for (it = cb->items.item_array; it->func; it++) _special_event_count_inc(obj, pd, it); --