jaehyun pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=bbb1a8e156e7f42004bb3d5fdf307fc7fe32d136
commit bbb1a8e156e7f42004bb3d5fdf307fc7fe32d136 Author: Jaehyun Cho <[email protected]> Date: Mon Jan 19 15:35:17 2015 +0900 elm_transit: Fix crash issue caused by multiple transit effects. Summary: Fix crach issue caused by multiple transit effects on a single object. This patch prevents deleting obj_data while the obj_data is still used by other transit objects. This fix is related to commits "Support zoom keeping current map effect."(60214e6a172e42303fdfc69ef3d1996b25132242) and "Support rotation keeping current map effect."(1e06309be42fd2b5d0900b16da0178215c111681). @fix Reviewers: Hermet Differential Revision: https://phab.enlightenment.org/D1878 --- src/lib/elm_transit.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/lib/elm_transit.c b/src/lib/elm_transit.c index e225235..74e715f 100644 --- a/src/lib/elm_transit.c +++ b/src/lib/elm_transit.c @@ -88,6 +88,7 @@ struct _Elm_Transit_Obj_Data { struct _Elm_Transit_Obj_State *state; Eina_Bool freeze_events : 1; + int ref; }; typedef struct _Elm_Transit_Effect_Module Elm_Transit_Effect_Module; @@ -127,6 +128,7 @@ _transit_obj_data_update(Elm_Transit *transit, Evas_Object *obj) { _transit_obj_states_save(obj, obj_data); } + obj_data->ref++; evas_object_data_set(obj, _transit_key, obj_data); } @@ -172,10 +174,14 @@ _transit_obj_remove_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void * Elm_Transit_Obj_Data *obj_data = evas_object_data_get(obj, _transit_key); if (obj_data) { - free(obj_data->state); - free(obj_data); + obj_data->ref--; + if (obj_data->ref == 0) + { + free(obj_data->state); + free(obj_data); + evas_object_data_del(obj, _transit_key); + } } - evas_object_data_del(obj, _transit_key); _remove_obj_from_list(transit, obj); if (!transit->objs && !transit->deleted) elm_transit_del(transit); } @@ -188,7 +194,11 @@ _transit_obj_data_recover(Elm_Transit *transit, Evas_Object *obj) obj_data = evas_object_data_get(obj, _transit_key); if (!obj_data) return; - evas_object_data_del(obj, _transit_key); + + obj_data->ref--; + if (obj_data->ref == 0) + evas_object_data_del(obj, _transit_key); + evas_object_freeze_events_set(obj, obj_data->freeze_events); state = obj_data->state; if (state) @@ -204,9 +214,11 @@ _transit_obj_data_recover(Elm_Transit *transit, Evas_Object *obj) evas_object_map_enable_set(obj, state->map_enabled); evas_object_map_set(obj, state->map); } - free(state); + if (obj_data->ref == 0) + free(state); } - free(obj_data); + if (obj_data->ref == 0) + free(obj_data); } static void --
