bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=712266fb9ae3e7cd2ea009189b2d94cd4ec333ab

commit 712266fb9ae3e7cd2ea009189b2d94cd4ec333ab
Author: Mike Blumenkrantz <zm...@samsung.com>
Date:   Mon Oct 21 16:05:33 2019 -0400

    elm/genlist: remove calc jobs
    
    now that we have a sane and consistent sizing calc mechanism, we no longer
    need to be randomly creating jobs to do additional side calcs in addition
    to our other multiple bespoke calculation methods
    
    instead, we can now call the calc function directly during the group calc
    to perform all the calcs at once and avoid the overhead of constantly 
triggering
    calc jobs
    
    a possible future improvement here could be to remove the _calc_job() call 
in
    the internal pan object's group_calculate, as this is likely a duplicated op
    but it will require additional testing to verify
    
    unit test performance (e.g., tree) increases roughly 50-80% after this patch
    
    Reviewed-by: Cedric BAIL <cedric.b...@free.fr>
    Differential Revision: https://phab.enlightenment.org/D10523
---
 src/lib/elementary/elm_genlist.c        | 61 ++++++++++++---------------------
 src/lib/elementary/elm_widget_genlist.h |  1 -
 2 files changed, 22 insertions(+), 40 deletions(-)

diff --git a/src/lib/elementary/elm_genlist.c b/src/lib/elementary/elm_genlist.c
index a1da165df3..f54040ac8c 100644
--- a/src/lib/elementary/elm_genlist.c
+++ b/src/lib/elementary/elm_genlist.c
@@ -183,14 +183,6 @@ static const Elm_Action key_actions[] = {
    {NULL, NULL}
 };
 
-static inline void
-_add_calc_job(Elm_Genlist_Data *sd)
-{
-   ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
-   if (!efl_alive_get(sd->obj)) return;
-   sd->calc_job = ecore_job_add(_calc_job, sd->obj);
-}
-
 static void
 _size_cache_free(void *data)
 {
@@ -296,7 +288,6 @@ _elm_genlist_pan_efl_gfx_entity_position_set(Eo *obj, 
Elm_Genlist_Pan_Data *psd,
 
    psd->wsd->pan_changed = EINA_TRUE;
    evas_object_smart_changed(obj);
-   ELM_SAFE_FREE(psd->wsd->calc_job, ecore_job_del);
 }
 
 static void
@@ -332,9 +323,7 @@ _elm_genlist_pan_efl_gfx_entity_size_set(Eo *obj, 
Elm_Genlist_Pan_Data *psd, Ein
    // away or appeared to queue a job to deal with it. it should settle in
    // the end to a steady-state
    if (old.w != size.w)
-     _add_calc_job(sd);
-   else
-     ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
+     efl_canvas_group_change(sd->obj);
 
 super:
    efl_gfx_entity_size_set(efl_super(obj, MY_PAN_CLASS), size);
@@ -783,7 +772,7 @@ _must_recalc_idler(void *data)
 {
    ELM_GENLIST_DATA_GET(data, sd);
 
-   _add_calc_job(sd);
+   efl_canvas_group_change(sd->obj);
    sd->must_recalc_idler = NULL;
    return ECORE_CALLBACK_CANCEL;
 }
@@ -793,7 +782,7 @@ _calc_job(void *data)
 {
    int in = 0;
    Item_Block *itb, *chb = NULL;
-   ELM_GENLIST_DATA_GET(data, sd);
+   Elm_Genlist_Data *sd = data;
    Eina_Bool minw_change = EINA_FALSE;
    Eina_Bool did_must_recalc = EINA_FALSE;
    Evas_Coord minw = -1, minh = 0, y = 0, ow = 0, vw = 0;
@@ -905,7 +894,7 @@ _calc_job(void *data)
    if (did_must_recalc)
      {
         if (!sd->must_recalc_idler)
-          sd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, data);
+          sd->must_recalc_idler = ecore_idler_add(_must_recalc_idler, sd->obj);
      }
    if (!sd->show_item) sd->check_scroll = EINA_FALSE;
    if (sd->check_scroll)
@@ -917,7 +906,6 @@ _calc_job(void *data)
           _item_scroll(sd);
      }
 
-   sd->calc_job = NULL;
    evas_object_smart_changed(sd->pan_obj);
    evas_event_thaw(e);
    evas_event_thaw_eval(e);
@@ -956,11 +944,13 @@ _elm_genlist_efl_canvas_group_group_calculate(Eo *obj, 
Elm_Genlist_Data *sd)
                {
                   itb->must_recalc = EINA_TRUE;
                }
-             _add_calc_job(sd);
+             _calc_job(sd);
           }
         minw = vmw;
         minh = vmh;
      }
+   else
+     _calc_job(sd);
 
    if (sd->scr_minw)
      {
@@ -2621,9 +2611,7 @@ _elm_genlist_pan_efl_canvas_group_group_calculate(Eo 
*obj, Elm_Genlist_Pan_Data
 
    if (sd->pan_changed)
      {
-        ecore_job_del(sd->calc_job);
-        sd->calc_job = NULL;
-        _calc_job(sd->obj);
+        _calc_job(sd);
         sd->pan_changed = EINA_FALSE;
      }
 
@@ -3577,7 +3565,7 @@ _elm_genlist_efl_ui_widget_theme_apply(Eo *obj, 
Elm_Genlist_Data *sd)
         itb->changed = EINA_TRUE;
      }
    if (sd->obj && efl_finalized_get(obj))
-     _add_calc_job(sd);
+     efl_canvas_group_change(sd->obj);
    elm_layout_sizing_eval(obj);
    evas_event_thaw(e);
    evas_event_thaw_eval(e);
@@ -3699,7 +3687,7 @@ _item_block_del(Elm_Gen_Item *it)
    itb->items = eina_list_remove(itb->items, it);
    itb->count--;
    itb->changed = EINA_TRUE;
-   _add_calc_job(sd);
+   efl_canvas_group_change(sd->obj);
    if (itb->count < 1)
      {
         Item_Block *itbn;
@@ -3767,8 +3755,6 @@ _item_block_del(Elm_Gen_Item *it)
      {
         sd->pan_changed = EINA_TRUE;
         evas_object_smart_changed(sd->pan_obj);
-        ecore_job_del(sd->calc_job);
-        sd->calc_job = NULL;
      }
 }
 
@@ -3847,7 +3833,7 @@ _elm_genlist_item_del_serious(Elm_Gen_Item *it)
      sd->group_items = eina_list_remove(sd->group_items, it);
 
    ELM_SAFE_FREE(sd->state, eina_inlist_sorted_state_free);
-   _add_calc_job(sd);
+   efl_canvas_group_change(sd->obj);
 
    ELM_SAFE_FREE(it->item, free);
 }
@@ -4049,7 +4035,7 @@ _item_mouse_move_cb(void *data,
              else
                _item_position(it, VIEW(it), it->item->scrl_x, y_pos);
 
-             _add_calc_job(sd);
+             efl_canvas_group_change(sd->obj);
           }
         return;
      }
@@ -4653,7 +4639,7 @@ newblock:
    itb->count++;
    itb->changed = EINA_TRUE;
    it->item->block = itb;
-   _add_calc_job(itb->sd);
+   efl_canvas_group_change(itb->sd->obj);
 
    if (itb->count > itb->sd->max_items_per_block)
      {
@@ -4812,7 +4798,6 @@ _item_process_post(Elm_Genlist_Data *sd, Elm_Gen_Item *it)
         if (sd->pan_changed)
           {
              evas_object_smart_changed(sd->pan_obj);
-             ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
           }
      }
    if (show_me) it->item->block->show_me = EINA_TRUE;
@@ -4898,7 +4883,7 @@ _item_idle_enterer(void *data)
    if (wakeup)
      {
         // wake up mainloop
-        _add_calc_job(sd);
+        efl_canvas_group_change(sd->obj);
      }
    if (ok == ECORE_CALLBACK_CANCEL) sd->queue_idle_enterer = NULL;
 
@@ -5144,7 +5129,7 @@ _item_mouse_up_cb(void *data,
           }
         else
           {
-             _add_calc_job(sd);
+             efl_canvas_group_change(sd->obj);
           }
         edje_object_signal_emit(VIEW(it), SIGNAL_REORDER_DISABLED, "elm");
         if (_elm_config->atspi_mode)
@@ -5541,7 +5526,7 @@ _update_job(void *data)
      }
    if (position)
      {
-        _add_calc_job(sd);
+        efl_canvas_group_change(sd->obj);
      }
    evas_event_thaw(e);
    evas_event_thaw_eval(e);
@@ -5895,7 +5880,6 @@ _elm_genlist_efl_canvas_group_group_del(Eo *obj, 
Elm_Genlist_Data *sd)
                                 EVAS_CALLBACK_CANVAS_VIEWPORT_RESIZE,
                                 _evas_viewport_resize_cb, sd);
 
-   ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
    ELM_SAFE_FREE(sd->update_job, ecore_job_del);
    ELM_SAFE_FREE(sd->pan_obj, evas_object_del);
    ELM_SAFE_FREE(sd->queue_idle_enterer, ecore_idle_enterer_del);
@@ -6048,7 +6032,6 @@ _internal_elm_genlist_clear(Evas_Object *obj)
    sd->pan_changed = EINA_TRUE;
    if (!sd->queue)
      {
-        ELM_SAFE_FREE(sd->calc_job, ecore_job_del);
         sd->anchor_item = NULL;
         ELM_SAFE_FREE(sd->queue_idle_enterer, ecore_idle_enterer_del);
         ELM_SAFE_FREE(sd->must_recalc_idler, ecore_idler_del);
@@ -7296,7 +7279,7 @@ _elm_genlist_item_coordinates_calc(Elm_Gen_Item *it,
         sd->scroll_to_type = type;
         it->item->show_me = EINA_TRUE;
 
-        _add_calc_job(sd);
+        efl_canvas_group_change(sd->obj);
 
         return EINA_FALSE;
      }
@@ -7912,7 +7895,7 @@ _item_filtered_get(Elm_Gen_Item *it)
         _filter_item_internal(it);
         if (it->item->block)
           it->item->block->changed = EINA_TRUE;
-        _add_calc_job(sd);
+        efl_canvas_group_change(sd->obj);
    }
    if (!it->hide) return EINA_TRUE;
    return EINA_FALSE;
@@ -7971,7 +7954,7 @@ _item_filter_enterer(void *data)
    if (wakeup)
      {
         // wake up mainloop
-        _add_calc_job(sd);
+        efl_canvas_group_change(sd->obj);
      }
    if (ok == ECORE_CALLBACK_CANCEL)
      {
@@ -8023,7 +8006,7 @@ _elm_genlist_filter_set(Eo *obj EINA_UNUSED, 
Elm_Genlist_Data *sd, void *filter_
               }
          }
      }
-   _calc_job(sd->obj);
+   _calc_job(sd);
 
    sd->queue_filter_enterer = ecore_idle_enterer_add(_item_filter_enterer,
                                                      sd->obj);
@@ -8277,7 +8260,7 @@ _elm_genlist_decorate_mode_set(Eo *obj, Elm_Genlist_Data 
*sd, Eina_Bool decorate
           }
      }
 
-   _add_calc_job(sd);
+   efl_canvas_group_change(sd->obj);
 }
 
 EOLIAN static void
@@ -8423,7 +8406,7 @@ _flip_job(void *data)
 
    it->flipped = EINA_TRUE;
    it->item->nocache = EINA_TRUE;
-   _add_calc_job(sd);
+   efl_canvas_group_change(sd->obj);
 }
 
 EOLIAN static void
diff --git a/src/lib/elementary/elm_widget_genlist.h 
b/src/lib/elementary/elm_widget_genlist.h
index 613f258af0..b7ce598390 100644
--- a/src/lib/elementary/elm_widget_genlist.h
+++ b/src/lib/elementary/elm_widget_genlist.h
@@ -55,7 +55,6 @@ struct _Elm_Genlist_Data
    Elm_Object_Item                      *last_selected_item;
    Elm_Object_Item                      *focused_item; /**< a focused item by 
keypad arrow or mouse. This is set to NULL if widget looses focus. */
    Elm_Object_Item                      *last_focused_item; /**< This records 
the last focused item when widget looses focus. This is required to set the 
focus on last focused item when widgets gets focus. */
-   Ecore_Job                            *calc_job;
    int                                   walking;
    int                                   minw, minh;
    unsigned int                          item_count;

-- 


Reply via email to