cedric pushed a commit to branch master.

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

commit cd4c0324ec531541f67680c6c54fc9951b0f2967
Author: se.osadchy <se.osad...@samsung.com>
Date:   Mon Feb 23 14:42:42 2015 +0100

    evas: Evas_3D - add destructors for clean of memory.
    
    Summary: Update and add new destructors.
    
    Reviewers: Hermet, raster, cedric
    
    Reviewed By: cedric
    
    Subscribers: cedric
    
    Differential Revision: https://phab.enlightenment.org/D2029
---
 src/lib/evas/canvas/evas_3d_camera.c   | 18 ++++++++++++++++--
 src/lib/evas/canvas/evas_3d_light.c    | 16 +++++++++++++++-
 src/lib/evas/canvas/evas_3d_material.c | 23 ++++++++++++++++++++---
 src/lib/evas/canvas/evas_3d_mesh.c     |  1 -
 src/lib/evas/canvas/evas_3d_node.c     | 11 ++++++++---
 src/lib/evas/canvas/evas_3d_node.eo    |  1 +
 src/lib/evas/canvas/evas_3d_texture.c  | 20 +++++++++++++++++++-
 7 files changed, 79 insertions(+), 11 deletions(-)

diff --git a/src/lib/evas/canvas/evas_3d_camera.c 
b/src/lib/evas/canvas/evas_3d_camera.c
index c6da2d3..7a9c8a5 100644
--- a/src/lib/evas/canvas/evas_3d_camera.c
+++ b/src/lib/evas/canvas/evas_3d_camera.c
@@ -74,8 +74,22 @@ EOLIAN static void
 _evas_3d_camera_eo_base_destructor(Eo *obj,
                                       Evas_3D_Camera_Data *pd)
 {
-   //evas_3d_object_unreference(&pd->base);
-   if (pd->nodes) eina_hash_free(pd->nodes);
+   Eina_Iterator *it = NULL;
+   void *data = NULL;
+   Evas_3D_Node_Data *node = NULL;
+
+   if (pd->nodes)
+     {
+        it = eina_hash_iterator_key_new(pd->nodes);
+        while (eina_iterator_next(it, &data))
+          {
+             node = eo_data_scope_get(data, EVAS_3D_NODE_CLASS);
+             node->data.camera.camera = NULL;
+          }
+
+        eina_hash_free(pd->nodes);
+     }
+
    eo_do_super(obj, MY_CLASS, eo_destructor());
 }
 
diff --git a/src/lib/evas/canvas/evas_3d_light.c 
b/src/lib/evas/canvas/evas_3d_light.c
index f9ca75b..d8c73b6 100644
--- a/src/lib/evas/canvas/evas_3d_light.c
+++ b/src/lib/evas/canvas/evas_3d_light.c
@@ -97,8 +97,22 @@ _evas_3d_light_eo_base_constructor(Eo *obj, 
Evas_3D_Light_Data *pd)
 EOLIAN static void
 _evas_3d_light_eo_base_destructor(Eo *obj, Evas_3D_Light_Data *pd)
 {
+   Eina_Iterator *it = NULL;
+   void *data = NULL;
+   Evas_3D_Node_Data *node = NULL;
+
    if (pd->nodes)
-     eina_hash_free(pd->nodes);
+     {
+        it = eina_hash_iterator_key_new(pd->nodes);
+        while (eina_iterator_next(it, &data))
+          {
+             node = eo_data_scope_get(data, EVAS_3D_NODE_CLASS);
+             node->data.light.light = NULL;
+          }
+
+        eina_hash_free(pd->nodes);
+     }
+
    eo_do_super(obj, MY_CLASS, eo_destructor());
 }
 
diff --git a/src/lib/evas/canvas/evas_3d_material.c 
b/src/lib/evas/canvas/evas_3d_material.c
index 8cd325d..aee8c85 100644
--- a/src/lib/evas/canvas/evas_3d_material.c
+++ b/src/lib/evas/canvas/evas_3d_material.c
@@ -104,17 +104,34 @@ _evas_3d_material_eo_base_constructor(Eo *obj 
EINA_UNUSED, Evas_3D_Material_Data
 EOLIAN static void
 _evas_3d_material_eo_base_destructor(Eo *obj, Evas_3D_Material_Data *pd)
 {
-   int i;
+   int i = 0;
+   Eina_Iterator *it = NULL;
+   void *data = NULL;
+   Evas_3D_Mesh_Data *mesh = NULL;
+   Eina_List *l = NULL;
+   Evas_3D_Mesh_Frame *f = NULL;
 
    if (pd->meshes)
-     eina_hash_free(pd->meshes);
+     {
+        it = eina_hash_iterator_key_new(pd->meshes);
+        while (eina_iterator_next(it, &data))
+          {
+             mesh = eo_data_scope_get(data, EVAS_3D_MESH_CLASS);
+             if (mesh->frames)
+               {
+                  EINA_LIST_FOREACH(mesh->frames, l, f)
+                     f->material = NULL;
+               }
+          }
+        eina_iterator_free(it);
+        eina_hash_free(pd->meshes);
+     }
 
    for (i = 0; i < EVAS_3D_MATERIAL_ATTRIB_COUNT; i++)
      {
         if (pd->attribs[i].texture)
           {
              evas_3d_texture_material_del(pd->attribs[i].texture, obj);
-             //eo_unref(pd->attribs[i].texture);
           }
      }
    eo_do_super(obj, MY_CLASS, eo_destructor());
diff --git a/src/lib/evas/canvas/evas_3d_mesh.c 
b/src/lib/evas/canvas/evas_3d_mesh.c
index 44304380..27006f4 100644
--- a/src/lib/evas/canvas/evas_3d_mesh.c
+++ b/src/lib/evas/canvas/evas_3d_mesh.c
@@ -259,7 +259,6 @@ _evas_3d_mesh_eo_base_constructor(Eo *obj, 
Evas_3D_Mesh_Data *pd)
 EOLIAN static void
 _evas_3d_mesh_eo_base_destructor(Eo *obj, Evas_3D_Mesh_Data *pd)
 {
-   //evas_3d_object_unreference(&pd->base);
    _mesh_fini(pd);
    eo_do_super(obj, MY_CLASS, eo_destructor());
 }
diff --git a/src/lib/evas/canvas/evas_3d_node.c 
b/src/lib/evas/canvas/evas_3d_node.c
index 84f6204..af91886 100644
--- a/src/lib/evas/canvas/evas_3d_node.c
+++ b/src/lib/evas/canvas/evas_3d_node.c
@@ -628,7 +628,6 @@ _node_free(Evas_3D_Object *obj)
 
         EINA_LIST_FOREACH(pd->data.mesh.meshes, l, m)
           {
-             //evas_3d_mesh_node_del(m, node);
              eo_unref(m);
           }
 
@@ -643,8 +642,6 @@ _node_free(Evas_3D_Object *obj)
 
    if (pd->scenes_camera)
      eina_hash_free(pd->scenes_camera);
-
-   //free(node);
 }
 
 void
@@ -1048,6 +1045,14 @@ _evas_3d_node_constructor(Eo *obj, Evas_3D_Node_Data 
*pd, Evas_3D_Node_Type type
      }
 }
 
+EOLIAN static void
+_evas_3d_node_eo_base_destructor(Eo *obj, Evas_3D_Node_Data *pd EINA_UNUSED)
+{
+   _node_free(obj);
+
+   eo_do_super(obj, MY_CLASS, eo_destructor());
+}
+
 EOLIAN static Evas_3D_Node_Type
 _evas_3d_node_type_get(Eo *obj EINA_UNUSED, Evas_3D_Node_Data *pd)
 {
diff --git a/src/lib/evas/canvas/evas_3d_node.eo 
b/src/lib/evas/canvas/evas_3d_node.eo
index ae24823..b602fd2 100644
--- a/src/lib/evas/canvas/evas_3d_node.eo
+++ b/src/lib/evas/canvas/evas_3d_node.eo
@@ -578,6 +578,7 @@ class Evas_3D_Node (Evas_3D_Object, Evas.Common_Interface)
       }
    }
    implements {
+      Eo.Base.destructor;
       Evas_3D_Object.update_notify;
       Evas_3D_Object.change_notify;
       Evas_3D_Object.callback_register;
diff --git a/src/lib/evas/canvas/evas_3d_texture.c 
b/src/lib/evas/canvas/evas_3d_texture.c
index 8945fad..e289d10 100644
--- a/src/lib/evas/canvas/evas_3d_texture.c
+++ b/src/lib/evas/canvas/evas_3d_texture.c
@@ -161,8 +161,14 @@ static void
 _texture_fini(Evas_3D_Texture *obj)
 {
    Eo *evas = NULL;
+   int i = 0;
+   Eina_Iterator *it = NULL;
+   void *data = NULL;
+   Evas_3D_Material_Data *material = NULL;
+
    eo_do(obj, evas = evas_common_evas_get());
    Evas_3D_Texture_Data *pd = eo_data_scope_get(obj, MY_CLASS);
+
    if (pd->engine_data)
      {
         Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS);
@@ -173,6 +179,19 @@ _texture_fini(Evas_3D_Texture *obj)
 
    if (pd->materials)
      {
+        it = eina_hash_iterator_key_new(pd->materials);
+        EINA_ITERATOR_FOREACH(it, data)
+          {
+             material = eo_data_scope_get(data, EVAS_3D_MATERIAL_CLASS);
+             if (!material) continue;
+             for (i = 0; i < EVAS_3D_MATERIAL_ATTRIB_COUNT; i++)
+               {
+                  if (material->attribs[i].texture)
+                       
evas_3d_texture_material_del(material->attribs[i].texture, data);
+               }
+          }
+        eina_iterator_free(it);
+
         eina_hash_free(pd->materials);
         pd->materials = NULL;
      }
@@ -311,7 +330,6 @@ _evas_3d_texture_eo_base_constructor(Eo *obj, 
Evas_3D_Texture_Data *pd EINA_UNUS
 EOLIAN static void
 _evas_3d_texture_eo_base_destructor(Eo *obj, Evas_3D_Texture_Data *pd  
EINA_UNUSED)
 {
-   //evas_3d_object_unreference(&pd->base);
    _texture_fini(obj);
    eo_do_super(obj, MY_CLASS, eo_destructor());
 }

-- 


Reply via email to