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




-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to