cedric pushed a commit to branch master.

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

commit 7c92d4fa7bb0edd7dc6967deebed0ff4e189361a
Author: Cedric BAIL <[email protected]>
Date:   Mon Oct 20 10:46:16 2014 +0200

    edje: correctly destroy reference to removed part.
    
    NOTE: I do believe their is still the possibility that a wrong program
    or part may reference a dead part. Would require to check that scenario
    better later.
---
 src/bin/edje/edje_cc.h          |  1 +
 src/bin/edje/edje_cc_handlers.c | 30 +++++++++++++++---------------
 src/bin/edje/edje_cc_out.c      | 19 +++++++++++++++++++
 3 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/src/bin/edje/edje_cc.h b/src/bin/edje/edje_cc.h
index 6a6d79f..7b794ed 100644
--- a/src/bin/edje/edje_cc.h
+++ b/src/bin/edje/edje_cc.h
@@ -174,6 +174,7 @@ void    data_queue_part_nest_lookup(Edje_Part_Collection 
*pc, const char *name,
 void    data_queue_copied_part_nest_lookup(Edje_Part_Collection *pc, int *src, 
int *dest, char **dest2);
 void    data_queue_part_reallocated_lookup(Edje_Part_Collection *pc, const 
char *name,
                                           unsigned char **base, int offset);
+void    part_lookup_del(Edje_Part_Collection *pc, int *dest);
 void    part_lookup_delete(Edje_Part_Collection *pc, const char *name, int 
*dest, char **dest2);
 void    data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int 
*dest);
 void   *data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, 
int *dest);
diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c
index 451c695..845aa53 100644
--- a/src/bin/edje/edje_cc_handlers.c
+++ b/src/bin/edje/edje_cc_handlers.c
@@ -4206,13 +4206,13 @@ _part_desc_free(Edje_Part_Collection *pc,
 {
    if (!ed) return NULL;
 
-   part_lookup_delete(pc, ep->name, &(ed->rel1.id_x), NULL);
-   part_lookup_delete(pc, ep->name, &(ed->rel1.id_y), NULL);
-   part_lookup_delete(pc, ep->name, &(ed->rel2.id_x), NULL);
-   part_lookup_delete(pc, ep->name, &(ed->rel2.id_y), NULL);
-   part_lookup_delete(pc, ep->name, &(ed->map.id_persp), NULL);
-   part_lookup_delete(pc, ep->name, &(ed->map.id_light), NULL);
-   part_lookup_delete(pc, ep->name, &(ed->map.rot.id_center), NULL);
+   part_lookup_del(pc, &(ed->rel1.id_x));
+   part_lookup_del(pc, &(ed->rel1.id_y));
+   part_lookup_del(pc, &(ed->rel2.id_x));
+   part_lookup_del(pc, &(ed->rel2.id_y));
+   part_lookup_del(pc, &(ed->map.id_persp));
+   part_lookup_del(pc, &(ed->map.id_light));
+   part_lookup_del(pc, &(ed->map.rot.id_center));
 
    switch (ep->type)
      {
@@ -4230,17 +4230,17 @@ _part_desc_free(Edje_Part_Collection *pc,
       case EDJE_PART_TYPE_TEXT:
       case EDJE_PART_TYPE_TEXTBLOCK:
         {
-           /* Edje_Part_Description_Text *ted = (Edje_Part_Description_Text*) 
ed; */
+           Edje_Part_Description_Text *ted = (Edje_Part_Description_Text*) ed;
 
-           /* part_lookup_delete(pc, ep->name, &(ted->text.id_source_part)); */
-           /* part_lookup_delete(pc, ep->name, 
&(ted->text.id_text_source_part)); */
+           part_lookup_del(pc, &(ted->text.id_source));
+           part_lookup_del(pc, &(ted->text.id_text_source));
            break;
         }
       case EDJE_PART_TYPE_PROXY:
         {
            Edje_Part_Description_Proxy *ped = (Edje_Part_Description_Proxy*) 
ed;
 
-           part_lookup_delete(pc, ep->name, &(ped->proxy.id), NULL);
+           part_lookup_del(pc, &(ped->proxy.id));
            break;
         }
      }
@@ -4256,10 +4256,10 @@ _part_free(Edje_Part_Collection *pc, Edje_Part *ep)
    Edje_Part_Parser *epp = (Edje_Part_Parser*)ep;
    unsigned int j;
 
-   part_lookup_delete(pc, ep->name, &(ep->clip_to_id), NULL);
-   part_lookup_delete(pc, ep->name, &(ep->dragable.confine_id), NULL);
-   part_lookup_delete(pc, ep->name, &(ep->dragable.threshold_id), NULL);
-   part_lookup_delete(pc, ep->name, &(ep->dragable.event_id), NULL);
+   part_lookup_del(pc, &(ep->clip_to_id));
+   part_lookup_del(pc, &(ep->dragable.confine_id));
+   part_lookup_del(pc, &(ep->dragable.threshold_id));
+   part_lookup_del(pc, &(ep->dragable.event_id));
 
    _part_desc_free(pc, ep, ep->default_desc);
    for (j = 0 ; j < ep->other.desc_count ; j++)
diff --git a/src/bin/edje/edje_cc_out.c b/src/bin/edje/edje_cc_out.c
index 83a341b..d503663 100755
--- a/src/bin/edje/edje_cc_out.c
+++ b/src/bin/edje/edje_cc_out.c
@@ -2268,6 +2268,25 @@ data_queue_part_reallocated_lookup(Edje_Part_Collection 
*pc, const char *name,
 }
 
 void
+part_lookup_del(Edje_Part_Collection *pc, int *dest)
+{
+   Part_Lookup_Key key;
+   Part_Lookup *pl = NULL;
+   Eina_List *list;
+   key.pc = pc;
+   key.mem.dest = dest;
+   key.stable = EINA_TRUE;
+
+   pl = eina_hash_find(part_pc_dest_lookup, &key);
+   if (!pl) return;
+   list = eina_hash_find(part_dest_lookup, &pl->key);
+   if (list)
+     eina_hash_del(part_dest_lookup, &pl->key, list);
+   eina_hash_del(part_pc_dest_lookup, &key, pl);
+}
+
+
+void
 part_lookup_delete(Edje_Part_Collection *pc, const char *name, int *dest, char 
**dest2)
 {
    Part_Lookup_Key key;

-- 


Reply via email to