Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore


Modified Files:
      Tag: SPLIT
        ecore.c ecore_main.c ecore_private.h ecore_timer.c 


Log Message:
protect from doign strange things with deleting timers... :)


===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Attic/ecore.c,v
retrieving revision 1.1.2.8
retrieving revision 1.1.2.9
diff -u -3 -r1.1.2.8 -r1.1.2.9
--- ecore.c     25 Feb 2003 04:32:26 -0000      1.1.2.8
+++ ecore.c     27 Feb 2003 01:03:45 -0000      1.1.2.9
@@ -38,6 +38,9 @@
  * This function shuts down all things set up in ecore_init() and cleans up all
  * event queues, handlers, filters, timers, idlers, idle enterers etc. set up
  * after ecore_init() was called.
+ * 
+ * Do not call this function from any callback that may be called from the main
+ * loop, as the main loop will then fall over and not function properly.
  */
 void
 ecore_shutdown(void)
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Attic/ecore_main.c,v
retrieving revision 1.1.2.7
retrieving revision 1.1.2.8
diff -u -3 -r1.1.2.7 -r1.1.2.8
--- ecore_main.c        25 Feb 2003 04:32:26 -0000      1.1.2.7
+++ ecore_main.c        27 Feb 2003 01:03:46 -0000      1.1.2.8
@@ -10,7 +10,8 @@
 static void _ecore_main_fd_handlers_cleanup(void);
 static void _ecore_main_fd_handlers_call(void);
 static int _ecore_main_fd_handlers_buf_call(void);
-    
+
+static  int               in_main_loop = 0;
 static  int               quit = 0;
 static  Ecore_Fd_Handler *fd_handlers = NULL;
 static  int               fd_handlers_delete_me = 0;
@@ -26,6 +27,7 @@
 void
 ecore_main_loop_begin(void)
 {
+   in_main_loop = 1;
    for (;quit == 0;)
      {
        double next_time;
@@ -38,6 +40,7 @@
             
             now = ecore_time_get();
             while (_ecore_timer_call(now));
+            _ecore_timer_cleanup();
          }
        /* process signals into events .... */
        while (_ecore_signal_count_get()) _ecore_signal_call();
@@ -141,6 +144,7 @@
        while (_ecore_main_fd_handlers_buf_call());
      }
    quit = 0;
+   in_main_loop = 0;
 }
 
 /**
@@ -285,6 +289,14 @@
 void
 _ecore_main_shutdown(void)
 {
+   if (in_main_loop)
+     {
+       fprintf(stderr,
+               "\n"
+               "*** ECORE WARINING: Calling ecore_shutdown() while still in the main 
loop.\n"
+               "***                 Program may crash or behave strangely now.\n");
+       return;
+     }
    while (fd_handlers)
      {
        Ecore_Fd_Handler *fdh;
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Attic/ecore_private.h,v
retrieving revision 1.1.2.10
retrieving revision 1.1.2.11
diff -u -3 -r1.1.2.10 -r1.1.2.11
--- ecore_private.h     23 Feb 2003 02:00:56 -0000      1.1.2.10
+++ ecore_private.h     27 Feb 2003 01:03:46 -0000      1.1.2.11
@@ -65,6 +65,7 @@
    ECORE_MAGIC;
    double       in;
    double       at;
+   char         delete_me : 1;
    char         just_added : 1;
    int        (*func) (void *data);
    void        *data;
@@ -140,6 +141,7 @@
 void          _ecore_magic_fail(void *d, Ecore_Magic m, Ecore_Magic req_m, const char 
*fname);
 
 void          _ecore_timer_shutdown(void);
+void          _ecore_timer_cleanup(void);    
 double        _ecore_timer_next_get(void);
 int           _ecore_timer_call(double when);
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Attic/ecore_timer.c,v
retrieving revision 1.1.2.8
retrieving revision 1.1.2.9
diff -u -3 -r1.1.2.8 -r1.1.2.9
--- ecore_timer.c       25 Feb 2003 08:06:01 -0000      1.1.2.8
+++ ecore_timer.c       27 Feb 2003 01:03:46 -0000      1.1.2.9
@@ -5,6 +5,7 @@
 
 static void _ecore_timer_set(Ecore_Timer *timer, double at, double in, int (*func) 
(void *data), void *data);
 
+static int          timers_delete_me = 0;
 static Ecore_Timer *timers = NULL;
 
 /**
@@ -93,19 +94,16 @@
 void *
 ecore_timer_del(Ecore_Timer *timer)
 {
-   void *data;
-
    if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
      {
        ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
                         "ecore_timer_del");
        return NULL;
      }
-   timers = _ecore_list_remove(timers, timer);
-   data = timer->data;
-   ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
-   free(timer);
-   return data;
+   if (timer->delete_me) return timer->data;
+   timers_delete_me++;
+   timer->delete_me = 1;
+   return timer->data;
 }
 
 void
@@ -122,6 +120,30 @@
      }
 }
 
+void
+_ecore_timer_cleanup(void)
+{
+   Ecore_List *l;
+
+   if (!timers_delete_me) return;
+   for (l = (Ecore_List *)timers; l;)
+     {
+       Ecore_Timer *timer;
+       
+       timer = (Ecore_Timer *)l;
+       l = l->next;
+       if (timer->delete_me)
+         {
+            timers = _ecore_list_remove(timers, timer);
+            ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
+            free(timer);
+            timers_delete_me--;
+            if (timers_delete_me == 0) return;
+         }
+     }
+   timers_delete_me = 0;
+}
+
 double
 _ecore_timer_next_get(void)
 {
@@ -154,7 +176,8 @@
      {
        timer = (Ecore_Timer *)l;
        if ((timer->at <= when) &&
-           (!timer->just_added))
+           (!timer->just_added) &&
+           (!timer->delete_me))
          {
             timers = _ecore_list_remove(timers, timer);
             _ecore_timer_call(when);




-------------------------------------------------------
This SF.net email is sponsored by: Scholarships for Techies!
Can't afford IT training? All 2003 ictp students receive scholarships.
Get hands-on training in Microsoft, Cisco, Sun, Linux/UNIX, and more.
www.ictp.com/training/sourceforge.asp
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to