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