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

-- 


Reply via email to