From: <enl...@li...> - 2003-08-13 11:04:56
|
Enlightenment CVS committal Author : raster Project : e17 Module : libs/edje Dir : e17/libs/edje/src/lib Modified Files: edje_callbacks.c edje_private.h edje_program.c Log Message: make ending programs safe while iterating =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_callbacks.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- edje_callbacks.c 10 Jul 2003 13:34:04 -0000 1.6 +++ edje_callbacks.c 13 Aug 2003 11:03:19 -0000 1.7 @@ -166,6 +166,7 @@ animl = evas_list_remove(animl, animl->data); if (!ed->paused) { + ed->walking_actions = 1; for (l = ed->actions; l; l = l->next) newl = evas_list_append(newl, l->data); while (newl) @@ -174,8 +175,29 @@ runp = newl->data; newl = evas_list_remove(newl, newl->data); - _edje_program_run_iterate(runp, t); + if (!runp->delete_me) + _edje_program_run_iterate(runp, t); } + for (l = ed->actions; l; l = l->next) + newl = evas_list_append(newl, l->data); + while (newl) + { + Edje_Running_Program *runp; + + runp = newl->data; + newl = evas_list_remove(newl, newl->data); + if (runp->delete_me) + { + _edje_anim_count--; + runp->edje->actions = + evas_list_remove(runp->edje->actions, runp); + if (!runp->edje->actions) + _edje_animators = + evas_list_remove(_edje_animators, runp->edje); + free(runp); + } + } + ed->walking_actions = 0; } _edje_thaw(ed); _edje_unref(ed); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_private.h,v retrieving revision 1.39 retrieving revision 1.40 diff -u -3 -r1.39 -r1.40 --- edje_private.h 5 Aug 2003 14:33:35 -0000 1.39 +++ edje_private.h 13 Aug 2003 11:03:20 -0000 1.40 @@ -372,6 +372,7 @@ unsigned short paused : 1; unsigned short no_anim : 1; unsigned short calc_only : 1; + unsigned short walking_actions : 1; double paused_at; Evas *evas; /* the evas this edje belongs to */ Evas_Object *obj; /* the smart object */ @@ -444,6 +445,7 @@ Edje *edje; Edje_Program *program; double start_time; + char delete_me : 1; }; struct _Edje_Signal_Callback =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_program.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- edje_program.c 8 Aug 2003 08:14:35 -0000 1.16 +++ edje_program.c 13 Aug 2003 11:03:20 -0000 1.17 @@ -233,10 +233,14 @@ } } _edje_recalc(runp->edje); - _edje_anim_count--; - runp->edje->actions = evas_list_remove(runp->edje->actions, runp); - if (!runp->edje->actions) - _edje_animators = evas_list_remove(_edje_animators, runp->edje); + runp->delete_me = 1; + if (!runp->edje->walking_actions) + { + _edje_anim_count--; + runp->edje->actions = evas_list_remove(runp->edje->actions, runp); + if (!runp->edje->actions) + _edje_animators = evas_list_remove(_edje_animators, runp->edje); + } _edje_emit(runp->edje, "program,stop", runp->program->name); if (runp->program->after >= 0) { @@ -248,7 +252,7 @@ } _edje_thaw(runp->edje); _edje_unref(runp->edje); - free(runp); + if (!runp->edje->walking_actions) free(runp); return 0; } _edje_recalc(runp->edje); @@ -284,14 +288,18 @@ } } _edje_recalc(runp->edje); - _edje_anim_count--; - runp->edje->actions = evas_list_remove(runp->edje->actions, runp); - if (!runp->edje->actions) - _edje_animators = evas_list_remove(_edje_animators, runp->edje); + runp->delete_me = 1; + if (!runp->edje->walking_actions) + { + _edje_anim_count--; + runp->edje->actions = evas_list_remove(runp->edje->actions, runp); + if (!runp->edje->actions) + _edje_animators = evas_list_remove(_edje_animators, runp->edje); + } _edje_emit(runp->edje, "program,stop", runp->program->name); _edje_thaw(runp->edje); _edje_unref(runp->edje); - free(runp); + if (!runp->edje->walking_actions) free(runp); } void |