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; --
