cedric pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=d7e77c2f77654513dec91abe47fde658c6a470bf
commit d7e77c2f77654513dec91abe47fde658c6a470bf Author: Cedric BAIL <ced...@osg.samsung.com> Date: Sat Aug 15 12:43:05 2015 +0200 view_list: small optimization reducing memory consumption using Eo_Event array of callbacks. Now that smart callback have been converted to Eo_Event to, there is a lot of place in our code base where we can do this easy memory optimization. --- src/lib/elm_view_list.c | 68 ++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/src/lib/elm_view_list.c b/src/lib/elm_view_list.c index 93bd7c4..0f3d1a2 100644 --- a/src/lib/elm_view_list.c +++ b/src/lib/elm_view_list.c @@ -42,7 +42,19 @@ static Eina_Bool _efl_model_load_status_change_cb(void *, Eo *, const Eo_Event_D static Eina_Bool _efl_model_children_count_change_cb(void *, Eo *, const Eo_Event_Description *, void *); static Eina_Bool _efl_model_properties_change_cb(void *, Eo *, const Eo_Event_Description *, void *); +static Eina_Bool _expand_request_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info); +static Eina_Bool _contract_request_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info); +static Eina_Bool _contracted_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info); + /* --- Genlist Callbacks --- */ +EO_CALLBACKS_ARRAY_DEFINE(model_callbacks, + { EFL_MODEL_BASE_EVENT_LOAD_STATUS, _efl_model_load_status_change_cb }, + { EFL_MODEL_BASE_EVENT_CHILDREN_COUNT_CHANGED, _efl_model_children_count_change_cb }); +EO_CALLBACKS_ARRAY_DEFINE(genlist_callbacks, + { ELM_GENLIST_EVENT_EXPAND_REQUEST, _expand_request_cb }, + { ELM_GENLIST_EVENT_CONTRACT_REQUEST, _contract_request_cb }, + { ELM_GENLIST_EVENT_CONTRACTED, _contracted_cb }); + static void _item_sel_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -60,12 +72,9 @@ _item_del(void *data, Evas_Object *obj EINA_UNUSED) if (!idata) return; - eo_do(idata->model, eo_event_callback_del(EFL_MODEL_BASE_EVENT_PROPERTIES_CHANGED, - _efl_model_properties_change_cb, idata)); - eo_do(idata->model, eo_event_callback_del(EFL_MODEL_BASE_EVENT_LOAD_STATUS, - _efl_model_load_status_change_cb, idata)); - eo_do(idata->model, eo_event_callback_del(EFL_MODEL_BASE_EVENT_CHILDREN_COUNT_CHANGED, - _efl_model_children_count_change_cb, idata)); + eo_do(idata->model, + eo_event_callback_array_del(model_callbacks(), idata), + eo_event_callback_del(EFL_MODEL_BASE_EVENT_PROPERTIES_CHANGED, _efl_model_properties_change_cb, idata)); eo_unref(idata->model); idata->model = NULL; @@ -159,10 +168,7 @@ _expand_request_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_D EINA_SAFETY_ON_NULL_RETURN_VAL(idata, EINA_TRUE); eo_do(idata->model, st = efl_model_load_status_get()); - eo_do(idata->model, eo_event_callback_add(EFL_MODEL_BASE_EVENT_LOAD_STATUS, - _efl_model_load_status_change_cb, idata)); - eo_do(idata->model, eo_event_callback_add(EFL_MODEL_BASE_EVENT_CHILDREN_COUNT_CHANGED, - _efl_model_children_count_change_cb, idata)); + eo_do(idata->model, eo_event_callback_array_add(model_callbacks(), idata)); if (st & EFL_MODEL_LOAD_STATUS_LOADED_CHILDREN) { @@ -181,10 +187,7 @@ _contract_request_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event Elm_Object_Item *item = event_info; View_List_ItemData *idata = elm_object_item_data_get(item); - eo_do(idata->model, eo_event_callback_del(EFL_MODEL_BASE_EVENT_LOAD_STATUS, - _efl_model_load_status_change_cb, idata)); - eo_do(idata->model, eo_event_callback_del(EFL_MODEL_BASE_EVENT_CHILDREN_COUNT_CHANGED, - _efl_model_children_count_change_cb, idata)); + eo_do(idata->model, eo_event_callback_array_del(model_callbacks(), idata)); elm_genlist_item_expanded_set(item, EINA_FALSE); return EINA_TRUE; } @@ -205,9 +208,7 @@ _genlist_deleted(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_ if (priv && priv->genlist && priv->genlist == obj) { eo_do(priv->genlist, - eo_event_callback_del(ELM_GENLIST_EVENT_EXPAND_REQUEST, _expand_request_cb, priv), - eo_event_callback_del(ELM_GENLIST_EVENT_CONTRACT_REQUEST, _contract_request_cb, priv), - eo_event_callback_del(ELM_GENLIST_EVENT_CONTRACTED, _contracted_cb, priv)); + eo_event_callback_array_del(genlist_callbacks(), priv)); eo_unref(priv->genlist); priv->genlist = NULL; } @@ -258,8 +259,9 @@ _efl_model_load_children(View_List_ItemData *pdata) idata->parent = pdata; idata->model = child; eo_ref(child); - eo_do(child, eo_event_callback_add(EFL_MODEL_BASE_EVENT_PROPERTIES_CHANGED, - _efl_model_properties_change_cb, idata)); + eo_do(child, + eo_event_callback_add(EFL_MODEL_BASE_EVENT_PROPERTIES_CHANGED, + _efl_model_properties_change_cb, idata)); eo_do(child, efl_model_properties_load()); idata->item = elm_genlist_item_append(priv->genlist, priv->itc, idata, pdata->item, priv->itype, _item_sel_cb, idata); @@ -309,10 +311,8 @@ _priv_model_set(Elm_View_List_Data *priv, Eo *model) if (priv->model != NULL) { - eo_do(priv->model, eo_event_callback_del(EFL_MODEL_BASE_EVENT_LOAD_STATUS, - _efl_model_load_status_change_cb, priv->rootdata)); - eo_do(priv->model, eo_event_callback_del(EFL_MODEL_BASE_EVENT_CHILDREN_COUNT_CHANGED, - _efl_model_children_count_change_cb, priv->rootdata)); + eo_do(priv->model, + eo_event_callback_array_del(model_callbacks(), priv->rootdata)); eo_do(priv->genlist, elm_obj_genlist_clear()); eo_unref(priv->model); priv->model = NULL; @@ -325,11 +325,9 @@ _priv_model_set(Elm_View_List_Data *priv, Eo *model) priv->rootdata->model = priv->model; eo_ref(priv->model); - eo_do(priv->model, eo_event_callback_add(EFL_MODEL_BASE_EVENT_LOAD_STATUS, - _efl_model_load_status_change_cb, priv->rootdata)); - eo_do(priv->model, eo_event_callback_add(EFL_MODEL_BASE_EVENT_CHILDREN_COUNT_CHANGED, - _efl_model_children_count_change_cb, priv->rootdata)); - eo_do(priv->model, load_st = efl_model_load_status_get()); + eo_do(priv->model, + eo_event_callback_array_add(model_callbacks(), priv->rootdata), + load_st = efl_model_load_status_get()); if (load_st & EFL_MODEL_LOAD_STATUS_LOADED_CHILDREN) { _efl_model_load_children(priv->rootdata); @@ -362,9 +360,7 @@ _elm_view_list_genlist_set(Eo *obj, Elm_View_List_Data *priv, Evas_Object *genli priv->prop_con = eina_hash_string_superfast_new(free); eo_do(priv->genlist, - eo_event_callback_add(ELM_GENLIST_EVENT_EXPAND_REQUEST, _expand_request_cb, priv), - eo_event_callback_add(ELM_GENLIST_EVENT_CONTRACT_REQUEST, _contract_request_cb, priv), - eo_event_callback_add(ELM_GENLIST_EVENT_CONTRACTED, _contracted_cb, priv)); + eo_event_callback_array_add(genlist_callbacks(), priv)); evas_object_event_callback_add(priv->genlist, EVAS_CALLBACK_DEL, _genlist_deleted, priv); } @@ -375,10 +371,8 @@ _elm_view_list_eo_base_destructor(Eo *obj, Elm_View_List_Data *priv) EINA_SAFETY_ON_NULL_RETURN(priv); EINA_SAFETY_ON_NULL_RETURN(obj); - eo_do(priv->model, eo_event_callback_del(EFL_MODEL_BASE_EVENT_LOAD_STATUS, - _efl_model_load_status_change_cb, priv->rootdata)); - eo_do(priv->model, eo_event_callback_del(EFL_MODEL_BASE_EVENT_CHILDREN_COUNT_CHANGED, - _efl_model_children_count_change_cb, priv->rootdata)); + eo_do(priv->model, + eo_event_callback_array_del(model_callbacks(), priv->rootdata)); eo_do(priv->genlist, elm_obj_genlist_clear()); elm_genlist_item_class_free(priv->itc); @@ -389,9 +383,7 @@ _elm_view_list_eo_base_destructor(Eo *obj, Elm_View_List_Data *priv) if (priv->genlist) { evas_object_event_callback_del(priv->genlist, EVAS_CALLBACK_DEL, _genlist_deleted); eo_do(priv->genlist, - eo_event_callback_del(ELM_GENLIST_EVENT_EXPAND_REQUEST, _expand_request_cb, priv), - eo_event_callback_del(ELM_GENLIST_EVENT_CONTRACT_REQUEST, _contract_request_cb, priv), - eo_event_callback_del(ELM_GENLIST_EVENT_CONTRACTED, _contracted_cb, priv)); + eo_event_callback_array_del(genlist_callbacks(), priv)); eo_unref(priv->genlist); } --