From: Enlightenment S. <no-...@en...> - 2008-11-13 20:40:01
|
Log: it's 'UNsigned' char, not signed! Author: barbieri Date: 2008-11-13 12:39:56 -0800 (Thu, 13 Nov 2008) New Revision: 37606 Modified: trunk/ecore/src/lib/ecore/ecore_private.h Modified: trunk/ecore/src/lib/ecore/ecore_private.h =================================================================== --- trunk/ecore/src/lib/ecore/ecore_private.h 2008-11-13 20:39:13 UTC (rev 37605) +++ trunk/ecore/src/lib/ecore/ecore_private.h 2008-11-13 20:39:56 UTC (rev 37606) @@ -385,19 +385,19 @@ { Ecore_List2 __list_data; ECORE_MAGIC; - signed char delete_me : 1; - int (*func) (void *data); - void *data; + unsigned char delete_me : 1; + int (*func) (void *data); + void *data; }; struct _Ecore_Poller { Ecore_List2 __list_data; ECORE_MAGIC; - int ibit; - signed char delete_me : 1; - int (*func) (void *data); - void *data; + int ibit; + unsigned char delete_me : 1; + int (*func) (void *data); + void *data; }; #endif |
From: Enlightenment S. <no-...@en...> - 2008-11-13 20:42:04
|
Log: runtime configurable timer precision One can now configure the maximum acceptable delay to be introduced by Ecore so possibly more timers will be dispatched together, reducing wakeups and saving more power. Author: barbieri Date: 2008-11-13 12:42:01 -0800 (Thu, 13 Nov 2008) New Revision: 37607 Modified: trunk/ecore/src/lib/ecore/Ecore.h trunk/ecore/src/lib/ecore/ecore_timer.c Modified: trunk/ecore/src/lib/ecore/Ecore.h =================================================================== --- trunk/ecore/src/lib/ecore/Ecore.h 2008-11-13 20:39:56 UTC (rev 37606) +++ trunk/ecore/src/lib/ecore/Ecore.h 2008-11-13 20:42:01 UTC (rev 37607) @@ -302,6 +302,9 @@ EAPI void ecore_timer_delay(Ecore_Timer *timer, double add); EAPI double ecore_timer_pending_get(Ecore_Timer *timer); + EAPI double ecore_timer_precision_get(void); + EAPI void ecore_timer_precision_set(double precision); + EAPI Ecore_Animator *ecore_animator_add(int (*func) (void *data), const void *data); EAPI void *ecore_animator_del(Ecore_Animator *animator); EAPI void ecore_animator_frametime_set(double frametime); Modified: trunk/ecore/src/lib/ecore/ecore_timer.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_timer.c 2008-11-13 20:39:56 UTC (rev 37606) +++ trunk/ecore/src/lib/ecore/ecore_timer.c 2008-11-13 20:42:01 UTC (rev 37607) @@ -8,6 +8,7 @@ static Ecore_Timer *timers = NULL; static Ecore_Timer *suspended = NULL; static double last_check = 0.0; +static double precision = 10.0 / 1000000.0; /** * @defgroup Ecore_Time_Group Ecore Time Functions @@ -17,6 +18,52 @@ */ /** + * Retrieves the current precision used by timer infrastructure. + * + * @see ecore_timer_precision_set() + */ +EAPI double +ecore_timer_precision_get(void) +{ + return precision; +} + +/** + * Sets the precision to be used by timer infrastructure. + * + * When system calculates time to expire the next timer we'll be able + * to delay the timer by the given amount so more timers will fit in + * the same dispatch, waking up the system less often and thus being + * able to save power. + * + * Be aware that kernel may delay delivery even further, these delays + * are always possible due other tasks having higher priorities or + * other scheduler policies. + * + * Example: + * We have 2 timers, one that expires in a 2.0s and another that + * expires in 2.1s, if precision is 0.1s, then the Ecore will request + * for the next expire to happen in 2.1s and not 2.0s and another one + * of 0.1 as it would before. + * + * @note Ecore is smart enough to see if there are timers in the + * precision range, if it does not, in our example if no second timer + * in (T + precision) existed, then it would use the minimum timeout. + * + * @param value allowed introduced timeout delay, in seconds. + */ +EAPI void +ecore_timer_precision_set(double value) +{ + if (value < 0.0) + { + fprintf(stderr, "ERROR: precision %f less than zero, ignored\n", value); + return; + } + precision = value; +} + +/** * Creates a timer to call the given function in the given period of time. * @param in The interval in seconds. * @param func The given function. If @p func returns 1, the timer is @@ -281,23 +328,51 @@ } } +static inline Ecore_Timer * +_ecore_timer_first_get(void) +{ + Ecore_Timer *timer = (Ecore_Timer *)timers; + + while ((timer) && ((timer->delete_me) || (timer->just_added))) + timer = (Ecore_Timer *)((Ecore_List2 *)timer)->next; + + return timer; +} + +static inline Ecore_Timer * +_ecore_timer_after_get(Ecore_Timer *base) +{ + Ecore_Timer *timer = (Ecore_Timer *)((Ecore_List2 *)base)->next; + double maxtime = base->at + precision; + + while ((timer) && ((timer->delete_me) || (timer->just_added)) && (timer->at <= maxtime)) + timer = (Ecore_Timer *)((Ecore_List2 *)timer)->next; + + if ((!timer) || (timer->at > maxtime)) + return NULL; + + return timer; +} + double _ecore_timer_next_get(void) { double now; double in; - Ecore_Timer *timer; - - if (!timers) return -1; + Ecore_Timer *first, *second; + + first = _ecore_timer_first_get(); + if (!first) return -1; + + second = _ecore_timer_after_get(first); + if (second) + first = second; + now = ecore_loop_time_get(); - timer = (Ecore_Timer *)timers; - while ((timer) && ((timer->delete_me) || (timer->just_added))) - timer = (Ecore_Timer *)((Ecore_List2 *)timer)->next; - if (!timer) return -1; - in = timer->at - now; + in = first->at - now; if (in < 0) in = 0; return in; -} +} int _ecore_timer_call(double when) |
From: Enlightenment S. <no-...@en...> - 2008-11-24 00:49:07
|
Log: Easy to use and powerful getopt implementation. Create a parser description and give it the parameters, that's it. You can store values (automatically converting types!), count occurrences, make it true or false, create a list, choose from a list of items or even specify your own callback to process arguments! It was inspired by Python's optparse: http://www.python.org/doc/2.5.2/lib/module-optparse.html Author: barbieri Date: 2008-11-23 16:49:04 -0800 (Sun, 23 Nov 2008) New Revision: 37781 Added: trunk/ecore/src/lib/ecore/Ecore_Getopt.h trunk/ecore/src/lib/ecore/ecore_getopt.c Modified: trunk/ecore/src/lib/ecore/Makefile.am Added: trunk/ecore/src/lib/ecore/Ecore_Getopt.h Modified: trunk/ecore/src/lib/ecore/Makefile.am =================================================================== --- trunk/ecore/src/lib/ecore/Makefile.am 2008-11-24 00:19:57 UTC (rev 37780) +++ trunk/ecore/src/lib/ecore/Makefile.am 2008-11-24 00:49:04 UTC (rev 37781) @@ -7,7 +7,8 @@ include_HEADERS = \ Ecore.h \ Ecore_Data.h \ -Ecore_Str.h +Ecore_Str.h \ +Ecore_Getopt.h libecore_la_SOURCES = \ ecore.c \ @@ -32,7 +33,8 @@ ecore_timer.c \ ecore_tree.c \ ecore_value.c \ -ecore_poll.c +ecore_poll.c \ +ecore_getopt.c libecore_la_LIBADD = @dlopen_libs@ @EINA_LIBS@ @EVIL_LIBS@ @WIN32_LIBS@ -lm libecore_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ Added: trunk/ecore/src/lib/ecore/ecore_getopt.c |
From: Enlightenment S. <no-...@en...> - 2008-12-09 18:15:37
|
Log: Include stdio.h so ecore_getopt_help() is fine. We need FILE* for ecore_getopt_help(). Author: barbieri Date: 2008-12-09 10:15:28 -0800 (Tue, 09 Dec 2008) New Revision: 38067 Modified: trunk/ecore/src/lib/ecore/Ecore_Getopt.h Modified: trunk/ecore/src/lib/ecore/Ecore_Getopt.h =================================================================== --- trunk/ecore/src/lib/ecore/Ecore_Getopt.h 2008-12-09 17:56:31 UTC (rev 38066) +++ trunk/ecore/src/lib/ecore/Ecore_Getopt.h 2008-12-09 18:15:28 UTC (rev 38067) @@ -2,6 +2,7 @@ #define _ECORE_GETOPT_H #include <Eina.h> +#include <stdio.h> #ifdef EAPI # undef EAPI |
From: Enlightenment S. <no-...@en...> - 2008-12-20 14:29:48
|
Log: ecore_getopt: common callbacks go in. ecore_evas_list_engines and geometry_parse, they're used in almost all applications using ecore_getopt, let's avoid replicating code. Author: barbieri Date: 2008-12-20 06:29:45 -0800 (Sat, 20 Dec 2008) New Revision: 38247 Modified: trunk/ecore/src/lib/ecore/Ecore_Getopt.h trunk/ecore/src/lib/ecore/ecore_getopt.c Modified: trunk/ecore/src/lib/ecore/Ecore_Getopt.h =================================================================== --- trunk/ecore/src/lib/ecore/Ecore_Getopt.h 2008-12-20 13:39:15 UTC (rev 38246) +++ trunk/ecore/src/lib/ecore/Ecore_Getopt.h 2008-12-20 14:29:45 UTC (rev 38247) @@ -380,6 +380,12 @@ EAPI Eina_List *ecore_getopt_list_free(Eina_List *list); + /* helper functions to be used with ECORE_GETOPT_CALLBACK_*() */ + + EAPI unsigned char ecore_getopt_callback_ecore_evas_list_engines(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage); + EAPI unsigned char ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage); + + #ifdef __cplusplus } #endif Modified: trunk/ecore/src/lib/ecore/ecore_getopt.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_getopt.c 2008-12-20 13:39:15 UTC (rev 38246) +++ trunk/ecore/src/lib/ecore/ecore_getopt.c 2008-12-20 14:29:45 UTC (rev 38247) @@ -1639,3 +1639,64 @@ } return NULL; } + +/** + * Helper ecore_getopt callback to list available Ecore_Evas engines. + * + * This will list all available engines except buffer, this is useful + * for applications to let user choose how they should create windows + * with ecore_evas_new(). + * + * @c callback_data value is used as @c FILE* and says where to output + * messages, by default it is @c stdout. You can specify this value + * with ECORE_GETOPT_CALLBACK_FULL() or ECORE_GETOPT_CALLBACK_ARGS(). + * + * If there is a boolean storage provided, then it is marked with 1 + * when this option is executed. + */ +unsigned char +ecore_getopt_callback_ecore_evas_list_engines(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage) +{ + Eina_List *lst, *n; + const char *engine; + FILE *fp = data; + + if (!fp) + fp = stdout; + + lst = ecore_evas_engines_get(); + + fputs("supported engines:\n", fp); + EINA_LIST_FOREACH(lst, n, engine) + if (strcmp(engine, "buffer") != 0) + fprintf(fp, "\t%s\n", engine); + + ecore_evas_engines_free(lst); + + if (storage->boolp) + *storage->boolp = 1; + + return 1; +} + +/** + * Helper ecore_getopt callback to parse geometry (x:y:w:h). + * + * Storage must be a pointer to @c Eina_Rectangle and will be used to + * store the four values passed in the given string. + * + * @c callback_data value is ignored, you can safely use @c NULL. + */ +unsigned char +ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage) +{ + Eina_Rectangle *v = (Eina_Rectangle *)storage->ptrp; + + if (sscanf(str, "%d:%d:%d:%d", &v->x, &v->y, &v->w, &v->h) != 4) + { + fprintf(stderr, "ERROR: incorrect geometry value '%s'\n", str); + return 0; + } + + return 1; +} |
From: Enlightenment S. <no-...@en...> - 2009-02-26 22:02:05
|
Log: Fix problem reported by clang. By: Luis Felipe Strano Moraes Author: barbieri Date: 2009-02-26 14:02:00 -0800 (Thu, 26 Feb 2009) New Revision: 39256 Modified: trunk/ecore/src/lib/ecore/ecore_getopt.c Modified: trunk/ecore/src/lib/ecore/ecore_getopt.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_getopt.c 2009-02-26 20:12:44 UTC (rev 39255) +++ trunk/ecore/src/lib/ecore/ecore_getopt.c 2009-02-26 22:02:00 UTC (rev 39256) @@ -1103,14 +1103,13 @@ *(double *)data = d; } break; + default: + { + _ecore_getopt_desc_print_error(desc, "could not parse value.\n"); + return 0; + } } - if (!data) - { - _ecore_getopt_desc_print_error(desc, "could not parse value.\n"); - return 0; - } - *val->listp = eina_list_append(*val->listp, data); return 1; |
From: Enlightenment S. <no-...@en...> - 2009-04-09 21:31:32
|
Log: remove more debug code left by cedric. Author: barbieri Date: 2009-04-09 14:31:29 -0700 (Thu, 09 Apr 2009) New Revision: 39913 Modified: trunk/ecore/src/lib/ecore/ecore_main.c Modified: trunk/ecore/src/lib/ecore/ecore_main.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_main.c 2009-04-09 19:42:37 UTC (rev 39912) +++ trunk/ecore/src/lib/ecore/ecore_main.c 2009-04-09 21:31:29 UTC (rev 39913) @@ -298,8 +298,6 @@ int ret; Ecore_Fd_Handler *fdh; - int cr, cw, ce; - t = NULL; if ((!finite(timeout)) || (timeout == 0.0)) /* finite() tests for NaN, too big, too small, and infinity. */ { @@ -333,10 +331,6 @@ FD_ZERO(&wfds); FD_ZERO(&exfds); - cr = 0; - cw = 0; - ce = 0; - /* call the prepare callback for all handlers */ EINA_INLIST_FOREACH(fd_handlers, fdh) if (!fdh->delete_me && fdh->prep_func) @@ -345,19 +339,16 @@ { if (fdh->flags & ECORE_FD_READ) { - cr++; FD_SET(fdh->fd, &rfds); if (fdh->fd > max_fd) max_fd = fdh->fd; } if (fdh->flags & ECORE_FD_WRITE) { - cw++; FD_SET(fdh->fd, &wfds); if (fdh->fd > max_fd) max_fd = fdh->fd; } if (fdh->flags & ECORE_FD_ERROR) { - ce++; FD_SET(fdh->fd, &exfds); if (fdh->fd > max_fd) max_fd = fdh->fd; } @@ -368,18 +359,6 @@ if (ret < 0) { if (errno == EINTR) return -1; - if (errno == EBADF) - { - fprintf(stderr, "max_fd: %i\n", max_fd); - fprintf(stderr, "cr: %i, cw: %i, ce: %i\n", cr, cw, ce); - - EINA_INLIST_FOREACH(fd_handlers, fdh) - { - if (fdh->flags & ECORE_FD_WRITE) - fprintf(stderr, "%p => %i\n", fdh, fdh->fd); - } - abort(); - } } if (ret > 0) { |
From: Enlightenment S. <no-...@en...> - 2009-04-13 00:05:50
|
Log: useful function to join strings using separator. Author: barbieri Date: 2009-04-12 17:05:43 -0700 (Sun, 12 Apr 2009) New Revision: 40010 Modified: trunk/ecore/src/lib/ecore/Ecore_Str.h trunk/ecore/src/lib/ecore/ecore_str.c Modified: trunk/ecore/src/lib/ecore/Ecore_Str.h =================================================================== --- trunk/ecore/src/lib/ecore/Ecore_Str.h 2009-04-12 21:45:23 UTC (rev 40009) +++ trunk/ecore/src/lib/ecore/Ecore_Str.h 2009-04-13 00:05:43 UTC (rev 40010) @@ -29,6 +29,7 @@ /* we need this for size_t */ #include <stddef.h> +#include <string.h> /** * @file Ecore_Str.h @@ -59,6 +60,57 @@ EAPI char **ecore_str_split(const char *string, const char *delimiter, int max_tokens); +EAPI size_t ecore_str_join_len(char *dst, size_t size, char sep, const char *a, size_t a_len, const char *b, size_t b_len); + + +/** + * Join two strings and store the result in @a dst buffer. + * + * Similar to ecore_str_join_len(), but will compute the length of @a + * and @a b using strlen(). + * + * @param dst where to store the result. + * @param size byte size of dst, will write at most (size - 1) + * characters and then the '\0' (null terminator). + * @param sep separator character to use. + * @param a first string to use, before @a sep. + * @param b second string to use, after @a sep. + * + * @return the number of characters printed (not including the + * trailing '\0' used to end output to strings). Just like + * snprintf(), it will not write more than @a size bytes, thus a + * return value of @a size or more means that the output was + * truncated. + * + * @see ecore_str_join_len() and ecore_str_join_static() + */ +static inline size_t ecore_str_join(char *dst, size_t size, char sep, const char *a, const char *b) +{ + return ecore_str_join_len(dst, size, sep, a, strlen(a), b, strlen(b)); +} + +/** + * Join two static strings and store the result in static @a dst buffer. + * + * Similar to ecore_str_join_len(), but will assume string sizes are + * know using sizeof(X). + * + * @param dst where to store the result. + * @param sep separator character to use. + * @param a first string to use, before @a sep. + * @param b second string to use, after @a sep. + * + * @return the number of characters printed (not including the + * trailing '\0' used to end output to strings). Just like + * snprintf(), it will not write more than @a size bytes, thus a + * return value of @a size or more means that the output was + * truncated. + * + * @see ecore_str_join() and ecore_str_join_static() + */ +#define ecore_str_join_static(dst, sep, a, b) ecore_str_join_len(dst, sizeof(dst), sep, a, (sizeof(a) > 0) ? sizeof(a) - 1 : 0, b, (sizeof(b) > 0) ? sizeof(b) - 1 : 0) + + #ifdef __cplusplus } #endif Modified: trunk/ecore/src/lib/ecore/ecore_str.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_str.c 2009-04-12 21:45:23 UTC (rev 40009) +++ trunk/ecore/src/lib/ecore/ecore_str.c 2009-04-13 00:05:43 UTC (rev 40010) @@ -241,3 +241,62 @@ return str_array; } + +/** + * Join two strings of known length and store the result in @a dst buffer. + * + * @param dst where to store the result. + * @param size byte size of dst, will write at most (size - 1) + * characters and then the '\0' (null terminator). + * @param sep separator character to use. + * @param a first string to use, before @a sep. + * @param a_len length of @a a, not including '\0' (strlen()-like) + * @param b second string to use, after @a sep. + * @param b_len length of @a b, not including '\0' (strlen()-like) + * + * @return the number of characters printed (not including the + * trailing '\0' used to end output to strings). Just like + * snprintf(), it will not write more than @a size bytes, thus a + * return value of @a size or more means that the output was + * truncated. + * + * @see ecore_str_join() and ecore_str_join_static() + */ +size_t +ecore_str_join_len(char *dst, size_t size, char sep, const char *a, size_t a_len, const char *b, size_t b_len) +{ + size_t ret = a_len + b_len + 1; + size_t off; + + if (size < 1) return ret; + + if (size <= a_len) + { + memcpy(dst, a, size - 1); + dst[size - 1] = '\0'; + return ret; + } + + memcpy(dst, a, a_len); + off = a_len; + + if (size <= off + 1) + { + dst[size - 1] = '\0'; + return ret; + } + + dst[off] = sep; + off++; + + if (size <= off + b_len + 1) + { + memcpy(dst + off, b, size - off - 1); + dst[size - 1] = '\0'; + return ret; + } + + memcpy(dst + off, b, b_len); + dst[off + b_len] = '\0'; + return ret; +} |
From: Enlightenment S. <no-...@en...> - 2009-04-16 15:44:36
|
Log: Be able to change select() function used by main loop. Patch by Kenneth Christiansen, used to integrate with GLib and other main loops. Author: barbieri Date: 2009-04-16 08:44:26 -0700 (Thu, 16 Apr 2009) New Revision: 40110 Modified: trunk/ecore/src/lib/ecore/Ecore.h trunk/ecore/src/lib/ecore/ecore_main.c Modified: trunk/ecore/src/lib/ecore/Ecore.h =================================================================== --- trunk/ecore/src/lib/ecore/Ecore.h 2009-04-16 15:19:14 UTC (rev 40109) +++ trunk/ecore/src/lib/ecore/Ecore.h 2009-04-16 15:44:26 UTC (rev 40110) @@ -278,6 +278,10 @@ EAPI void *ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter); EAPI void ecore_main_loop_iterate(void); + + EAPI void ecore_main_loop_select_func_set(int (*func)(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)); + EAPI void *ecore_main_loop_select_func_get(void); + EAPI void ecore_main_loop_begin(void); EAPI void ecore_main_loop_quit(void); EAPI Ecore_Fd_Handler *ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, int (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data, int (*buf_func) (void *buf_data, Ecore_Fd_Handler *fd_handler), const void *buf_data); Modified: trunk/ecore/src/lib/ecore/ecore_main.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_main.c 2009-04-16 15:19:14 UTC (rev 40109) +++ trunk/ecore/src/lib/ecore/ecore_main.c 2009-04-16 15:44:26 UTC (rev 40110) @@ -47,6 +47,7 @@ static int do_quit = 0; static Ecore_Fd_Handler *fd_handlers = NULL; static int fd_handlers_delete_me = 0; +static int (*main_loop_select)(int , fd_set *, fd_set *, fd_set *, struct timeval *) = select; static double t1 = 0.0; static double t2 = 0.0; @@ -110,6 +111,37 @@ } /** + * Sets the function to use when monitoring multiple file descriptors, + * and waiting until one of more of the file descriptors before ready + * for some class of I/O operation. + * + * This function will be used instead of the system call select and + * could possible be used to integrate the Ecore event loop with an + * external event loop. + * + * @warning you don't know how to use, don't even try to use it. + * + * @ingroup Ecore_Main_Loop_Group + */ +EAPI void +ecore_main_loop_select_func_set(int (*func)(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)) +{ + main_loop_select = func; +} + +/** + * Gets the select function set by ecore_select_func_set(), + * or the native select function if none was set. + * + * @ingroup Ecore_Main_Loop_Group + */ +EAPI void * +ecore_main_loop_select_func_get(void) +{ + return main_loop_select; +} + +/** * @defgroup Ecore_FD_Handler_Group File Event Handling Functions * * Functions that deal with file descriptor handlers. @@ -361,7 +393,7 @@ } if (_ecore_signal_count_get()) return -1; - ret = select(max_fd + 1, &rfds, &wfds, &exfds, t); + ret = main_loop_select(max_fd + 1, &rfds, &wfds, &exfds, t); _ecore_loop_time = ecore_time_get(); if (ret < 0) { |
From: Enlightenment S. <no-...@en...> - 2009-05-29 16:33:05
|
Log: Avoid getting stuck into ecore main loop dispatchers. The old way we could run endless with the following case: int my_buggy_idler(void *data) { ecore_idler_add(my_buggy_idler, NULL); return 0; } since it would append to that list, then the list would never end. Now we just dispatch up to the last know idler, then go back to regular processing, if nothing happens we'll be back to dispatch again. I tested it here and works fine, but might show issues with ecore enterers/exiters of some applications that rely on the old (broken) behavior. Author: barbieri Date: 2009-05-29 09:33:00 -0700 (Fri, 29 May 2009) New Revision: 40847 Modified: trunk/ecore/src/lib/ecore/ecore_idle_enterer.c trunk/ecore/src/lib/ecore/ecore_idle_exiter.c trunk/ecore/src/lib/ecore/ecore_idler.c Modified: trunk/ecore/src/lib/ecore/ecore_idle_enterer.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_idle_enterer.c 2009-05-29 14:32:57 UTC (rev 40846) +++ trunk/ecore/src/lib/ecore/ecore_idle_enterer.c 2009-05-29 16:33:00 UTC (rev 40847) @@ -99,8 +99,10 @@ void _ecore_idle_enterer_call(void) { - Ecore_List2 *l; + Ecore_List2 *l, *last; + last = idle_enterers ? ((Ecore_List2 *)idle_enterers)->last : NULL; + for (l = (Ecore_List2 *)idle_enterers; l; l = l->next) { Ecore_Idle_Enterer *ie; @@ -110,6 +112,8 @@ { if (!ie->func(ie->data)) ecore_idle_enterer_del(ie); } + + if (l == last) break; } if (idle_enterers_delete_me) { Modified: trunk/ecore/src/lib/ecore/ecore_idle_exiter.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_idle_exiter.c 2009-05-29 14:32:57 UTC (rev 40846) +++ trunk/ecore/src/lib/ecore/ecore_idle_exiter.c 2009-05-29 16:33:00 UTC (rev 40847) @@ -75,8 +75,10 @@ void _ecore_idle_exiter_call(void) { - Ecore_List2 *l; + Ecore_List2 *l, *last; + last = idle_exiters ? ((Ecore_List2 *)idle_exiters)->last : NULL; + for (l = (Ecore_List2 *)idle_exiters; l; l = l->next) { Ecore_Idle_Exiter *ie; @@ -86,6 +88,8 @@ { if (!ie->func(ie->data)) ecore_idle_exiter_del(ie); } + + if (l == last) break; } if (idle_exiters_delete_me) { Modified: trunk/ecore/src/lib/ecore/ecore_idler.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_idler.c 2009-05-29 14:32:57 UTC (rev 40846) +++ trunk/ecore/src/lib/ecore/ecore_idler.c 2009-05-29 16:33:00 UTC (rev 40847) @@ -83,8 +83,10 @@ int _ecore_idler_call(void) { - Ecore_List2 *l; + Ecore_List2 *l, *last; + last = idlers ? ((Ecore_List2 *)idlers)->last : NULL; + for (l = (Ecore_List2 *)idlers; l; l = l->next) { Ecore_Idler *ie; @@ -94,6 +96,8 @@ { if (!ie->func(ie->data)) ecore_idler_del(ie); } + + if (l == last) break; } if (idlers_delete_me) { |
From: Enlightenment S. <no-...@en...> - 2009-06-06 22:32:23
|
Log: fix nasty bug of timers not being re-evaluated on rare case. If there are no other main loop activity than a idlers and one idler adds a timer, the new (and unique) timer would be ignored since it's flagged as "just_added" and thus next iteration will not consider it, possible entering an infinite wait as it could be the only thing to do in main loop. Antognolli found this nasty bug while handling timeout-and-die in Ethumb, where the "disconnect" event is dispatched by EDBus from idler and it was adding a timer to shutdown the daemon after a while without clients. By: Rafael Antognolli <ant...@pr...> Author: barbieri Date: 2009-06-06 15:31:34 -0700 (Sat, 06 Jun 2009) New Revision: 40923 Modified: trunk/ecore/src/lib/ecore/ecore_main.c Modified: trunk/ecore/src/lib/ecore/ecore_main.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_main.c 2009-06-06 22:25:01 UTC (rev 40922) +++ trunk/ecore/src/lib/ecore/ecore_main.c 2009-06-06 22:31:34 UTC (rev 40923) @@ -545,8 +545,6 @@ while (_ecore_timer_call(now)); _ecore_timer_cleanup(); } - /* any timers re-added as a result of these are allowed to go */ - _ecore_timer_enable_new(); /* process signals into events .... */ while (_ecore_signal_count_get()) _ecore_signal_call(); if (_ecore_event_exist()) @@ -596,6 +594,8 @@ _ecore_fps_debug_runtime_add(t2 - t1); } start_loop: + /* any timers re-added as a result of these are allowed to go */ + _ecore_timer_enable_new(); if (do_quit) { in_main_loop--; |
From: Enlightenment S. <no-...@en...> - 2009-06-12 15:23:35
|
Log: Add file required by NetBSD. Author: barbieri Date: 2009-06-12 08:23:32 -0700 (Fri, 12 Jun 2009) New Revision: 41017 Modified: trunk/ecore/src/lib/ecore/Ecore.h Modified: trunk/ecore/src/lib/ecore/Ecore.h =================================================================== --- trunk/ecore/src/lib/ecore/Ecore.h 2009-06-12 13:18:18 UTC (rev 41016) +++ trunk/ecore/src/lib/ecore/Ecore.h 2009-06-12 15:23:32 UTC (rev 41017) @@ -53,6 +53,7 @@ # include <winsock2.h> #else # include <sys/types.h> +# include <sys/time.h> # include <signal.h> #endif |
From: Enlightenment S. <no-...@en...> - 2009-06-17 02:38:44
|
Log: fix nasty warnings of -Wextra Author: barbieri Date: 2009-06-16 18:41:54 -0700 (Tue, 16 Jun 2009) New Revision: 41066 Modified: trunk/ecore/src/lib/ecore/Ecore_Getopt.h Modified: trunk/ecore/src/lib/ecore/Ecore_Getopt.h =================================================================== --- trunk/ecore/src/lib/ecore/Ecore_Getopt.h 2009-06-16 23:28:17 UTC (rev 41065) +++ trunk/ecore/src/lib/ecore/Ecore_Getopt.h 2009-06-17 01:41:54 UTC (rev 41066) @@ -149,6 +149,7 @@ const char *const *choices; /* NULL terminated. */ const Ecore_Getopt_Type append_type; const Ecore_Getopt_Desc_Callback callback; + const void *dummy; } action_param; }; @@ -328,7 +329,8 @@ {.append_type = type}} #define ECORE_GETOPT_COUNT(shortname, longname, help) \ - {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_COUNT} + {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_COUNT, \ + {.dummy = NULL}} #define ECORE_GETOPT_CALLBACK_FULL(shortname, longname, help, metavar, callback_func, callback_data, argument_requirement, default_value) \ {shortname, longname, help, metavar, ECORE_GETOPT_ACTION_CALLBACK, \ @@ -347,18 +349,26 @@ #define ECORE_GETOPT_HELP(shortname, longname) \ {shortname, longname, "show this message.", NULL, \ - ECORE_GETOPT_ACTION_HELP} + ECORE_GETOPT_ACTION_HELP, \ + {.dummy = NULL}} + #define ECORE_GETOPT_VERSION(shortname, longname) \ {shortname, longname, "show program version.", NULL, \ - ECORE_GETOPT_ACTION_VERSION} + ECORE_GETOPT_ACTION_VERSION, \ + {.dummy = NULL}} + #define ECORE_GETOPT_COPYRIGHT(shortname, longname) \ {shortname, longname, "show copyright.", NULL, \ - ECORE_GETOPT_ACTION_COPYRIGHT} + ECORE_GETOPT_ACTION_COPYRIGHT, \ + {.dummy = NULL}} + #define ECORE_GETOPT_LICENSE(shortname, longname) \ {shortname, longname, "show license.", NULL, \ - ECORE_GETOPT_ACTION_LICENSE} -#define ECORE_GETOPT_SENTINEL {0, NULL} + ECORE_GETOPT_ACTION_LICENSE, \ + {.dummy = NULL}} +#define ECORE_GETOPT_SENTINEL {0, NULL, NULL, NULL, 0, {.dummy = NULL}} + #define ECORE_GETOPT_VALUE_STR(val) {.strp = &(val)} #define ECORE_GETOPT_VALUE_BOOL(val) {.boolp = &(val)} #define ECORE_GETOPT_VALUE_SHORT(val) {.shortp = &(val)} |
From: Enlightenment S. <no-...@en...> - 2009-07-15 01:12:18
|
Log: oops, fix case of timers never being fired while we have idlers. To reach this case, have a timer that would not be fired on _ecore_main_loop_iterate_internal(), for example it's not ready yet (just_added==1), system would get into this inner loop and would never stop, since there is timer expired now (next_time == 0.0), if we go to start_loop it would just get into the same loop, not dispatching and timers. Python test 04-idler.py triggered that problem. Author: barbieri Date: 2009-07-14 17:11:04 -0700 (Tue, 14 Jul 2009) New Revision: 41342 Modified: trunk/ecore/src/lib/ecore/ecore_main.c Modified: trunk/ecore/src/lib/ecore/ecore_main.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_main.c 2009-07-14 23:33:45 UTC (rev 41341) +++ trunk/ecore/src/lib/ecore/ecore_main.c 2009-07-15 00:11:04 UTC (rev 41342) @@ -663,7 +663,7 @@ if (_ecore_signal_count_get() > 0) have_signal = 1; if (have_event || have_signal) break; next_time = _ecore_timer_next_get(); - if (next_time < 0) goto start_loop; + if (next_time <= 0) break; if (do_quit) break; } _ecore_loop_time = ecore_time_get(); |
From: Enlightenment S. <no-...@en...> - 2009-09-01 14:36:11
|
Log: some parts I missed before. Author: barbieri Date: 2009-09-01 07:35:59 -0700 (Tue, 01 Sep 2009) New Revision: 42156 Modified: trunk/ecore/src/lib/ecore/ecore_getopt.c Modified: trunk/ecore/src/lib/ecore/ecore_getopt.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_getopt.c 2009-09-01 14:15:37 UTC (rev 42155) +++ trunk/ecore/src/lib/ecore/ecore_getopt.c 2009-09-01 14:35:59 UTC (rev 42156) @@ -394,7 +394,7 @@ } used = _ecore_getopt_help_line - (fp, base, total, used, "Type: ", sizeof("Type: ") - 1); + (fp, base, total, used, _("Type: "), strlen(_("Type: "))); used = _ecore_getopt_help_line(fp, base, total, used, str, len); if (store->arg_req == ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES) @@ -410,8 +410,8 @@ len = str ? strlen(str) : 0; break; case ECORE_GETOPT_TYPE_BOOL: - str = store->def.boolv ? "TRUE" : "FALSE"; - len = store->def.boolv ? sizeof("TRUE") - 1 : sizeof("FALSE") - 1; + str = store->def.boolv ? _("true") : _("false"); + len = strlen(str); break; case ECORE_GETOPT_TYPE_SHORT: str = buf; @@ -461,7 +461,7 @@ } used = _ecore_getopt_help_line - (fp, base, total, used, "Default: ", sizeof("Default: ") - 1); + (fp, base, total, used, _("Default: "), strlen(_("Default: "))); used = _ecore_getopt_help_line(fp, base, total, used, str, len); end: @@ -484,7 +484,7 @@ fputc(' ', fp); used = _ecore_getopt_help_line - (fp, base, total, used, "Choices: ", sizeof("Choices: ") - 1); + (fp, base, total, used, _("Choices: "), strlen(_("Choices: "))); for (itr = desc->action_param.choices; *itr != NULL; itr++) { @@ -790,12 +790,15 @@ (strcasecmp(str, "f") == 0) || (strcasecmp(str, "false") == 0) || (strcasecmp(str, "no") == 0) || - (strcasecmp(str, "off") == 0) || - + (strcasecmp(str, "off") == 0) +#ifdef HAVE_GETTEXT + || (strcasecmp(str, _("f")) == 0) || (strcasecmp(str, _("false")) == 0) || (strcasecmp(str, _("no")) == 0) || - (strcasecmp(str, _("off")) == 0)) + (strcasecmp(str, _("off")) == 0) +#endif + ) { *v = 0; return 1; @@ -804,12 +807,15 @@ (strcasecmp(str, "t") == 0) || (strcasecmp(str, "true") == 0) || (strcasecmp(str, "yes") == 0) || - (strcasecmp(str, "on") == 0) || - + (strcasecmp(str, "on") == 0) +#ifdef HAVE_GETTEXT + || (strcasecmp(str, _("t")) == 0) || (strcasecmp(str, _("true")) == 0) || (strcasecmp(str, _("yes")) == 0) || - (strcasecmp(str, _("on")) == 0)) + (strcasecmp(str, _("on")) == 0) +#endif + ) { *v = 1; return 1; |
From: Enlightenment S. <no-...@en...> - 2009-10-31 22:56:40
|
Log: ecore_getopt: missing dummy initializer. not real problem, but shut up warnings. Author: barbieri Date: 2009-10-31 15:56:28 -0700 (Sat, 31 Oct 2009) New Revision: 43382 Modified: trunk/ecore/src/lib/ecore/Ecore_Getopt.h Modified: trunk/ecore/src/lib/ecore/Ecore_Getopt.h =================================================================== --- trunk/ecore/src/lib/ecore/Ecore_Getopt.h 2009-10-31 22:33:19 UTC (rev 43381) +++ trunk/ecore/src/lib/ecore/Ecore_Getopt.h 2009-10-31 22:56:28 UTC (rev 43382) @@ -309,9 +309,11 @@ {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_CONST, \ {.store_const = value}} #define ECORE_GETOPT_STORE_TRUE(shortname, longname, help) \ - {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_TRUE} + {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_TRUE, \ + {.dummy = NULL}} #define ECORE_GETOPT_STORE_FALSE(shortname, longname, help) \ - {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_FALSE} + {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_FALSE, \ + {.dummy = NULL}} #define ECORE_GETOPT_CHOICE(shortname, longname, help, choices_array) \ {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_CHOICE, \ |
From: Enlightenment S. <no-...@en...> - 2009-11-13 20:35:03
|
Log: do not run cleanup all the time and avoid bug of walking list from inside list. if l->next was also deleted by _ecore_main_fd_handlers_cleanup(), then we had a crash :-( Author: barbieri Date: 2009-11-13 12:34:51 -0800 (Fri, 13 Nov 2009) New Revision: 43676 Modified: trunk/ecore/src/lib/ecore/ecore_main.c Modified: trunk/ecore/src/lib/ecore/ecore_main.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_main.c 2009-11-13 18:54:55 UTC (rev 43675) +++ trunk/ecore/src/lib/ecore/ecore_main.c 2009-11-13 20:34:51 UTC (rev 43676) @@ -488,7 +488,6 @@ fprintf(stderr, "Fd function err returned 0, remove it\n"); fdh->delete_me = 1; fd_handlers_delete_me = 1; - _ecore_main_fd_handlers_cleanup(); } } else @@ -496,11 +495,11 @@ fprintf(stderr, "Problematic fd found at %d! setting it for delete\n", fdh->fd); fdh->delete_me = 1; fd_handlers_delete_me = 1; - _ecore_main_fd_handlers_cleanup(); } } - } + + _ecore_main_fd_handlers_cleanup(); } static void |
From: Enlightenment S. <no-...@en...> - 2010-01-06 05:17:06
|
Log: Ecore_Exe improvements. * add const to getters. * add ecore_exe_callback_pre_free_set(), enabling bindings to free their resources once the handle is destroyed. * fix some possible segv from not checking magic * check conditions before ecore_exe_send() does its work Author: barbieri Date: 2010-01-05 21:16:59 -0800 (Tue, 05 Jan 2010) New Revision: 44916 Modified: trunk/ecore/src/lib/ecore/Ecore.h trunk/ecore/src/lib/ecore/ecore_exe.c trunk/ecore/src/lib/ecore/ecore_pipe.c Modified: trunk/ecore/src/lib/ecore/Ecore.h =================================================================== --- trunk/ecore/src/lib/ecore/Ecore.h 2010-01-06 04:42:14 UTC (rev 44915) +++ trunk/ecore/src/lib/ecore/Ecore.h 2010-01-06 05:16:59 UTC (rev 44916) @@ -249,18 +249,19 @@ EAPI int ecore_exe_run_priority_get(void); EAPI Ecore_Exe *ecore_exe_run(const char *exe_cmd, const void *data); EAPI Ecore_Exe *ecore_exe_pipe_run(const char *exe_cmd, Ecore_Exe_Flags flags, const void *data); - EAPI int ecore_exe_send(Ecore_Exe *exe, const void *data, int size); + EAPI void ecore_exe_callback_pre_free_set(Ecore_Exe *exe, void (*func)(void *data, const Ecore_Exe *exe)); + EAPI Eina_Bool ecore_exe_send(Ecore_Exe *exe, const void *data, int size); EAPI void ecore_exe_close_stdin(Ecore_Exe *exe); EAPI void ecore_exe_auto_limits_set(Ecore_Exe *exe, int start_bytes, int end_bytes, int start_lines, int end_lines); EAPI Ecore_Exe_Event_Data *ecore_exe_event_data_get(Ecore_Exe *exe, Ecore_Exe_Flags flags); EAPI void ecore_exe_event_data_free(Ecore_Exe_Event_Data *data); EAPI void *ecore_exe_free(Ecore_Exe *exe); - EAPI pid_t ecore_exe_pid_get(Ecore_Exe *exe); + EAPI pid_t ecore_exe_pid_get(const Ecore_Exe *exe); EAPI void ecore_exe_tag_set(Ecore_Exe *exe, const char *tag); - EAPI char *ecore_exe_tag_get(Ecore_Exe *exe); - EAPI char *ecore_exe_cmd_get(Ecore_Exe *exe); - EAPI void *ecore_exe_data_get(Ecore_Exe *exe); - EAPI Ecore_Exe_Flags ecore_exe_flags_get(Ecore_Exe *exe); + EAPI const char *ecore_exe_tag_get(const Ecore_Exe *exe); + EAPI const char *ecore_exe_cmd_get(const Ecore_Exe *exe); + EAPI void *ecore_exe_data_get(const Ecore_Exe *exe); + EAPI Ecore_Exe_Flags ecore_exe_flags_get(const Ecore_Exe *exe); EAPI void ecore_exe_pause(Ecore_Exe *exe); EAPI void ecore_exe_continue(Ecore_Exe *exe); EAPI void ecore_exe_interrupt(Ecore_Exe *exe); Modified: trunk/ecore/src/lib/ecore/ecore_exe.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_exe.c 2010-01-06 04:42:14 UTC (rev 44915) +++ trunk/ecore/src/lib/ecore/ecore_exe.c 2010-01-06 05:16:59 UTC (rev 44916) @@ -121,6 +121,8 @@ Ecore_Timer *doomsday_clock; /* The Timer of Death. Muahahahaha. */ void *doomsday_clock_dead; /* data for the doomsday clock */ + + void (*pre_free_cb)(void *data, const Ecore_Exe *exe); }; @@ -708,6 +710,31 @@ } /** + * Defines a function to be called before really freeing the handle data. + * + * This might be useful for language bindings such as Python and Perl + * that need to deallocate wrappers associated with this handle. + * + * This handle should never be modified by this call. It should be + * considered informative only. All getters are valid when the given + * function is called back. + * + * @param exe The child process to attach the pre_free function. + * @param func The function to call before @a exe is freed. + */ +EAPI void +ecore_exe_callback_pre_free_set(Ecore_Exe *exe, void (*func)(void *data, const Ecore_Exe *exe)) +{ + if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) + { + ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, + "ecore_exe_callback_pre_free_set"); + return; + } + exe->pre_free_cb = func; +} + +/** * Sends data to the given child process which it recieves on stdin. * * This function writes to a child processes standard in, with unlimited @@ -717,14 +744,35 @@ * @param exe The child process to send to * @param data The data to send * @param size The size of the data to send, in bytes - * @return 1 if successful, 0 on failure. + * @return EINA_TRUE if successful, EINA_FALSE on failure. * @ingroup Ecore_Exe_Basic_Group */ -EAPI int +EAPI Eina_Bool ecore_exe_send(Ecore_Exe * exe, const void *data, int size) { void *buf; + if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) + { + ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_send"); + return 0; + } + + if (exe->close_stdin) + { + ERR("Ecore_Exe %p stdin is closed! Cannot send %d bytes from %p", + exe, size, data); + return 0; + } + + if (exe->child_fd_write == -1) + { + ERR("Ecore_Exe %p created without ECORE_EXE_PIPE_WRITE! " + "Cannot send %d bytes from %p", + exe, size, data); + return 0; + } + buf = realloc(exe->write_data_buf, exe->write_data_size + size); if (buf == NULL) return 0; @@ -970,6 +1018,8 @@ IF_FREE(exe->tag); if (tag) exe->tag = strdup(tag); + else + exe->tag = NULL; } /** @@ -979,11 +1029,13 @@ * else on this @p exe. * * @param exe The given process handle. - * @return The string attached to @p exe. + * @return The string attached to @p exe. It is a handle to existing + * internal string and should not be modified, use + * ecore_exe_tag_set() to change it. It might be @c NULL. * @ingroup Ecore_Exe_Basic_Group */ -EAPI char * -ecore_exe_tag_get(Ecore_Exe *exe) +EAPI const char * +ecore_exe_tag_get(const Ecore_Exe *exe) { if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) { @@ -1019,6 +1071,9 @@ data = exe->data; + if (exe->pre_free_cb) + exe->pre_free_cb(data, exe); + if (exe->doomsday_clock) { struct _ecore_exe_dead_exe *dead; @@ -1069,6 +1124,7 @@ EAPI void ecore_exe_event_data_free(Ecore_Exe_Event_Data *e) { + if (!e) return; IF_FREE(e->lines); IF_FREE(e->data); free(e); @@ -1081,7 +1137,7 @@ * @ingroup Ecore_Exe_Basic_Group */ EAPI pid_t -ecore_exe_pid_get(Ecore_Exe *exe) +ecore_exe_pid_get(const Ecore_Exe *exe) { if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) { @@ -1094,11 +1150,13 @@ /** * Retrieves the command of the given spawned process. * @param exe Handle to the given spawned process. - * @return The command on success. NULL otherwise. + * @return The command on success. NULL otherwise. This string is the + * pointer to the internal value and must not be modified in + * any way. * @ingroup Ecore_Exe_Basic_Group */ -EAPI char * -ecore_exe_cmd_get(Ecore_Exe *exe) +EAPI const char * +ecore_exe_cmd_get(const Ecore_Exe *exe) { if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) { @@ -1111,11 +1169,12 @@ /** * Retrieves the data attached to the given process handle. * @param exe The given process handle. - * @return The data pointer attached to @p exe. + * @return The data pointer attached to @p exe Given to + * ecore_exe_run() or ecore_exe_pipe_run() * @ingroup Ecore_Exe_Basic_Group */ EAPI void * -ecore_exe_data_get(Ecore_Exe *exe) +ecore_exe_data_get(const Ecore_Exe *exe) { if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) { @@ -1132,7 +1191,7 @@ * @ingroup Ecore_Exe_Basic_Group */ EAPI Ecore_Exe_Flags -ecore_exe_flags_get(Ecore_Exe *exe) +ecore_exe_flags_get(const Ecore_Exe *exe) { if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) { Modified: trunk/ecore/src/lib/ecore/ecore_pipe.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_pipe.c 2010-01-06 04:42:14 UTC (rev 44915) +++ trunk/ecore/src/lib/ecore/ecore_pipe.c 2010-01-06 05:16:59 UTC (rev 44916) @@ -430,7 +430,7 @@ ; else { - ERR("An unhandled error (ret: %d errno: %d)" + ERR("An unhandled error (ret: %zd errno: %d)" "occured while writing to the pipe the length", ret, errno); } @@ -464,7 +464,7 @@ ; else { - ERR("An unhandled error (ret: %d errno: %d)" + ERR("An unhandled error (ret: %zd errno: %d)" "occured while writing to the pipe the length", ret, errno); } @@ -503,8 +503,8 @@ else if (ret > 0) { /* XXX What should we do here? */ - ERR("Only read %d bytes from the pipe, although" - " we need to read %d bytes.", ret, sizeof(p->len)); + ERR("Only read %zd bytes from the pipe, although" + " we need to read %zd bytes.", ret, sizeof(p->len)); } else if (ret == 0) { @@ -519,7 +519,7 @@ return ECORE_CALLBACK_RENEW; else { - ERR("An unhandled error (ret: %d errno: %d)" + ERR("An unhandled error (ret: %zd errno: %d)" "occured while reading from the pipe the length", ret, errno); return ECORE_CALLBACK_RENEW; @@ -575,7 +575,7 @@ return ECORE_CALLBACK_RENEW; else { - ERR("An unhandled error (ret: %d errno: %d)" + ERR("An unhandled error (ret: %zd errno: %d)" "occured while reading from the pipe the data", ret, errno); return ECORE_CALLBACK_RENEW; |
From: Enlightenment S. <no-...@en...> - 2010-02-22 20:09:12
|
Log: fix ecore-glib reentrance if using ecore_main_loop_begin() multiple times (reentrant/recursive) with glib doing threads, then it would deadlock since the same thread would get the lock it already have. multiple ecore_main_loop_begin() is required to implement WebKit's alert/confirm/prompt dialogs since there is no async reply with callbacks, rather one must return the value. By: Lucas de Marchi Author: barbieri Date: 2010-02-22 12:09:03 -0800 (Mon, 22 Feb 2010) New Revision: 46361 Modified: trunk/ecore/src/lib/ecore/ecore_glib.c Modified: trunk/ecore/src/lib/ecore/ecore_glib.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_glib.c 2010-02-22 17:38:35 UTC (rev 46360) +++ trunk/ecore/src/lib/ecore/ecore_glib.c 2010-02-22 20:09:03 UTC (rev 46361) @@ -167,14 +167,11 @@ static int _ecore_glib_select(int ecore_fds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *ecore_timeout) { - static GStaticMutex lock = G_STATIC_MUTEX_INIT; - static GMutex *mutex = NULL; + GStaticMutex lock = G_STATIC_MUTEX_INIT; + GMutex *mutex = g_static_mutex_get_mutex(&lock); GMainContext *ctx = g_main_context_default(); int ret; - if (!mutex) - mutex = g_static_mutex_get_mutex(&lock); - if (g_main_context_acquire(ctx)) g_mutex_lock(mutex); else { |
From: Enlightenment S. <no-...@en...> - 2010-02-22 20:09:51
|
Log: fix my coding style errors... Author: barbieri Date: 2010-02-22 12:09:44 -0800 (Mon, 22 Feb 2010) New Revision: 46362 Modified: trunk/ecore/src/lib/ecore/ecore_glib.c Modified: trunk/ecore/src/lib/ecore/ecore_glib.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_glib.c 2010-02-22 20:09:03 UTC (rev 46361) +++ trunk/ecore/src/lib/ecore/ecore_glib.c 2010-02-22 20:09:44 UTC (rev 46362) @@ -174,13 +174,14 @@ if (g_main_context_acquire(ctx)) g_mutex_lock(mutex); - else { - if (!_ecore_glib_cond) - _ecore_glib_cond = g_cond_new(); + else + { + if (!_ecore_glib_cond) + _ecore_glib_cond = g_cond_new(); - while (!g_main_context_wait(ctx, _ecore_glib_cond, mutex)) - g_thread_yield(); - } + while (!g_main_context_wait(ctx, _ecore_glib_cond, mutex)) + g_thread_yield(); + } ret = _ecore_glib_select__locked (ctx, ecore_fds, rfds, wfds, efds, ecore_timeout); |
From: Enlightenment S. <no-...@en...> - 2010-02-23 21:04:47
|
Log: Fix the bug of the first timer being added from idler. We should start doing unit-test for ecore, accumulating these problems. Follows the test case: #include <Ecore.h> #include <Eina.h> static int _log_dom; #define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__) static int quiter(void *data) { INF("quit!"); ecore_main_loop_quit(); return 1; } static int idler(void *data) { INF("idler"); return 1; } static int cb1(void *data) { INF("cb1"); ecore_timer_add(0.0, quiter, NULL); return 0; } int main(void) { ecore_init(); _log_dom = eina_log_domain_register("test", EINA_COLOR_CYAN); /* * Create a main loop with just idlers, there is a special case * for just idlers without timers in ecore. * * From idler, add a timer that quits the application. It should * always quit. * * If it does not quit, then there is a bug of new timers not * being immediately detected and system never exits idle. */ INF("main: begin"); ecore_idler_add(cb1, NULL); ecore_idler_add(idler, NULL); ecore_main_loop_begin(); INF("main: end"); return 0; } Author: barbieri Date: 2010-02-23 13:04:38 -0800 (Tue, 23 Feb 2010) New Revision: 46405 Modified: trunk/ecore/src/lib/ecore/ecore_main.c trunk/ecore/src/lib/ecore/ecore_private.h trunk/ecore/src/lib/ecore/ecore_timer.c Modified: trunk/ecore/src/lib/ecore/ecore_main.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_main.c 2010-02-23 20:54:59 UTC (rev 46404) +++ trunk/ecore/src/lib/ecore/ecore_main.c 2010-02-23 21:04:38 UTC (rev 46405) @@ -777,8 +777,7 @@ if (_ecore_main_select(0.0) > 0) have_event = 1; if (_ecore_signal_count_get() > 0) have_signal = 1; if (have_event || have_signal) break; - next_time = _ecore_timer_next_get(); - if (next_time >= 0) goto start_loop; + if (_ecore_timers_exists()) goto start_loop; if (do_quit) break; } } Modified: trunk/ecore/src/lib/ecore/ecore_private.h =================================================================== --- trunk/ecore/src/lib/ecore/ecore_private.h 2010-02-23 20:54:59 UTC (rev 46404) +++ trunk/ecore/src/lib/ecore/ecore_private.h 2010-02-23 21:04:38 UTC (rev 46405) @@ -119,6 +119,7 @@ void _ecore_timer_cleanup(void); void _ecore_timer_enable_new(void); double _ecore_timer_next_get(void); +int _ecore_timers_exists(void); int _ecore_timer_call(double when); void _ecore_idler_shutdown(void); Modified: trunk/ecore/src/lib/ecore/ecore_timer.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_timer.c 2010-02-23 20:54:59 UTC (rev 46404) +++ trunk/ecore/src/lib/ecore/ecore_timer.c 2010-02-23 21:04:38 UTC (rev 46405) @@ -409,6 +409,17 @@ EINA_INLIST_FOREACH(timers, timer) timer->just_added = 0; } +int +_ecore_timers_exists(void) +{ + Ecore_Timer *timer = timers; + + while ((timer) && (timer->delete_me)) + timer = (Ecore_Timer *)EINA_INLIST_GET(timer)->next; + + return !!timer; +} + static inline Ecore_Timer * _ecore_timer_first_get(void) { |
From: Enlightenment S. <no-...@en...> - 2010-02-23 21:27:13
|
Log: Fix idlers when using recursive main loops. If an idler created a recursive main loop (just called ecore_main_loop_begin()), then this recursive main loop should continue to process idlers from there and on, thus idler_current was added. When going back from recursion, the current iterator should be updated properly. This patch also fixes the deletion of idlers from recursive main loops by reference counting them. This way, the node will not be free()d inside inner loop cleanups and then crash when going back to outer loop. The following test case used to crash but not anymore: #include <Ecore.h> #include <Eina.h> static int _log_dom; #define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__) static Ecore_Idler *handle; static int idler(void *data) { INF("idler"); return 1; } static int cb2(void *data) { INF("cb2 - delete cb1 handle"); ecore_idler_del(handle); ecore_main_loop_quit(); /* quits inner main loop */ return 0; } static int cb1(void *data) { INF("cb1: begin"); INF(" add cb2"); ecore_idler_add(cb2, NULL); INF(" inner main loop begin (recurse)"); ecore_main_loop_begin(); /* will it crash due ecore_idler_del(handle) * inside cb2()? It used to! */ INF("cb1: end"); ecore_main_loop_quit(); /* quits outer main loop */ return 0; } int main(void) { ecore_init(); _log_dom = eina_log_domain_register("test", EINA_COLOR_CYAN); /* * Creating a new main loop from inside an idler callback, and inside * this new (inner) main loop deleting the caller callback used to * crash since the handle would be effectively free()d, but when the * recursion is over the pointer would be used. */ INF("main: begin"); handle = ecore_idler_add(cb1, NULL); ecore_idler_add(idler, NULL); ecore_main_loop_begin(); INF("main: end"); return 0; } Author: barbieri Date: 2010-02-23 13:27:04 -0800 (Tue, 23 Feb 2010) New Revision: 46406 Modified: trunk/ecore/src/lib/ecore/ecore_idler.c Modified: trunk/ecore/src/lib/ecore/ecore_idler.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_idler.c 2010-02-23 21:04:38 UTC (rev 46405) +++ trunk/ecore/src/lib/ecore/ecore_idler.c 2010-02-23 21:27:04 UTC (rev 46406) @@ -16,13 +16,15 @@ { EINA_INLIST; ECORE_MAGIC; - int delete_me : 1; int (*func) (void *data); void *data; + int references; + Eina_Bool delete_me : 1; }; static Ecore_Idler *idlers = NULL; +static Ecore_Idler *idler_current = NULL; static int idlers_delete_me = 0; /** @@ -87,35 +89,58 @@ free(ie); } idlers_delete_me = 0; + idler_current = NULL; } int _ecore_idler_call(void) { - Ecore_Idler *ie; + if (!idler_current) + { + /* regular main loop, start from head */ + idler_current = idlers; + } + else + { + /* recursive main loop, continue from where we were */ + idler_current = (Ecore_Idler *)EINA_INLIST_GET(idler_current)->next; + } - EINA_INLIST_FOREACH(idlers, ie) + while (idler_current) { + Ecore_Idler *ie = (Ecore_Idler *)idler_current; if (!ie->delete_me) { + ie->references++; if (!ie->func(ie->data)) ecore_idler_del(ie); + ie->references--; } + if (idler_current) /* may have changed in recursive main loops */ + idler_current = (Ecore_Idler *)EINA_INLIST_GET(idler_current)->next; } if (idlers_delete_me) { - Ecore_Idler *l; + Ecore_Idler *l; + int deleted_idlers_in_use = 0; for (l = idlers; l;) { - ie = l; + Ecore_Idler *ie = l; l = (Ecore_Idler *) EINA_INLIST_GET(l)->next; if (ie->delete_me) { + if (ie->references) + { + deleted_idlers_in_use++; + continue; + } + idlers = (Ecore_Idler *) eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(ie)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); free(ie); } } - idlers_delete_me = 0; + if (!deleted_idlers_in_use) + idlers_delete_me = 0; } if (idlers) return 1; return 0; |
From: Enlightenment S. <no-...@en...> - 2010-02-23 22:13:49
|
Log: Fix idle_enterers when using recursive main loops. If an idle_enterer created a recursive main loop (just called ecore_main_loop_begin()), then this recursive main loop should continue to process idle_enterers from there and on, thus idle_enterer_current was added. When going back from recursion, the current iterator should be updated properly. This patch also fixes the deletion of idle_enterers from recursive main loops by reference counting them. This way, the node will not be free()d inside inner loop cleanups and then crash when going back to outer loop. The following test case used to crash but not anymore: #include <Ecore.h> #include <Eina.h> static int _log_dom; #define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__) static Ecore_Idle_Enterer *handle; static int idler(void *data) { INF("idler"); return 1; } static int cb2(void *data) { INF("cb2 - delete cb1 handle"); ecore_idle_enterer_del(handle); ecore_main_loop_quit(); /* quits inner main loop */ return 0; } static int cb1(void *data) { INF("cb1: begin"); INF(" add cb2"); ecore_idle_enterer_add(cb2, NULL); INF(" inner main loop begin (recurse)"); ecore_main_loop_begin(); /* will it crash due ecore_idle_enterer_del(handle) * inside cb2()? It used to! */ INF("cb1: end"); ecore_main_loop_quit(); /* quits outer main loop */ return 0; } int main(void) { ecore_init(); _log_dom = eina_log_domain_register("test", EINA_COLOR_CYAN); /* * Creating a new main loop from inside an idle_enterer callback, * and inside this new (inner) main loop deleting the caller * callback used to crash since the handle would be effectively * free()d, but when the recursion is over the pointer would be * used. */ INF("main: begin"); handle = ecore_idle_enterer_add(cb1, NULL); ecore_idler_add(idler, NULL); ecore_main_loop_begin(); INF("main: end"); return 0; } Author: barbieri Date: 2010-02-23 14:13:42 -0800 (Tue, 23 Feb 2010) New Revision: 46408 Modified: trunk/ecore/src/lib/ecore/ecore_idle_enterer.c Modified: trunk/ecore/src/lib/ecore/ecore_idle_enterer.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_idle_enterer.c 2010-02-23 21:49:04 UTC (rev 46407) +++ trunk/ecore/src/lib/ecore/ecore_idle_enterer.c 2010-02-23 22:13:42 UTC (rev 46408) @@ -16,13 +16,15 @@ { EINA_INLIST; ECORE_MAGIC; - int delete_me : 1; int (*func) (void *data); void *data; + int references; + Eina_Bool delete_me : 1; }; static Ecore_Idle_Enterer *idle_enterers = NULL; +static Ecore_Idle_Enterer *idle_enterer_current = NULL; static int idle_enterers_delete_me = 0; /** @@ -103,35 +105,61 @@ free(ie); } idle_enterers_delete_me = 0; + idle_enterer_current = NULL; } void _ecore_idle_enterer_call(void) { - Ecore_Idle_Enterer *ie; + if (!idle_enterer_current) + { + /* regular main loop, start from head */ + idle_enterer_current = idle_enterers; + } + else + { + /* recursive main loop, continue from where we were */ + idle_enterer_current = + (Ecore_Idle_Enterer *)EINA_INLIST_GET(idle_enterer_current)->next; + } - EINA_INLIST_FOREACH(idle_enterers, ie) + while (idle_enterer_current) { + Ecore_Idle_Enterer *ie = (Ecore_Idle_Enterer *)idle_enterer_current; if (!ie->delete_me) { + ie->references++; if (!ie->func(ie->data)) ecore_idle_enterer_del(ie); + ie->references--; } + if (idle_enterer_current) /* may have changed in recursive main loops */ + idle_enterer_current = + (Ecore_Idle_Enterer *)EINA_INLIST_GET(idle_enterer_current)->next; } if (idle_enterers_delete_me) { Ecore_Idle_Enterer *l; - for(l = idle_enterers; l;) + int deleted_idler_enterers_in_use = 0; + + for (l = idle_enterers; l;) { - ie = l; + Ecore_Idle_Enterer *ie = l; l = (Ecore_Idle_Enterer *) EINA_INLIST_GET(l)->next; if (ie->delete_me) { + if (ie->references) + { + deleted_idler_enterers_in_use++; + continue; + } + idle_enterers = (Ecore_Idle_Enterer *) eina_inlist_remove(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); free(ie); } } - idle_enterers_delete_me = 0; + if (!deleted_idler_enterers_in_use) + idle_enterers_delete_me = 0; } } |
From: Enlightenment S. <no-...@en...> - 2010-02-23 22:25:41
|
Log: Fix idle_exiters when using recursive main loops. If an idle_exiter created a recursive main loop (just called ecore_main_loop_begin()), then this recursive main loop should continue to process idle_exiters from there and on, thus idle_exiter_current was added. When going back from recursion, the current iterator should be updated properly. This patch also fixes the deletion of idle_exiters from recursive main loops by reference counting them. This way, the node will not be free()d inside inner loop cleanups and then crash when going back to outer loop. The following test case used to crash but not anymore: #include <Ecore.h> #include <Eina.h> static int _log_dom; #define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__) static Ecore_Idle_Exiter *handle; static int idler(void *data) { INF("idler"); return 1; } static int timer(void *data) { INF("timer (exited idle!)"); return 0; } static int exit_idle(void *data) { INF("add request (timer) to exit idle"); ecore_timer_add(0.0, timer, NULL); return 0; } static int cb2(void *data) { INF("cb2 - delete cb1 handle"); ecore_idle_exiter_del(handle); ecore_main_loop_quit(); /* quits inner main loop */ return 0; } static int cb1(void *data) { INF("cb1: begin"); INF(" add cb2"); ecore_idle_exiter_add(cb2, NULL); INF(" add exit idler"); ecore_idler_add(exit_idle, NULL); INF(" inner main loop begin (recurse)"); ecore_main_loop_begin(); /* will it crash due ecore_idle_exiter_del(handle) * inside cb2()? It used to! */ INF("cb1: end"); ecore_main_loop_quit(); /* quits outer main loop */ return 0; } int main(void) { ecore_init(); _log_dom = eina_log_domain_register("test", EINA_COLOR_CYAN); /* * Creating a new main loop from inside an idle_exiter callback, * and inside this new (inner) main loop deleting the caller * callback used to crash since the handle would be effectively * free()d, but when the recursion is over the pointer would be * used. */ INF("main: begin"); handle = ecore_idle_exiter_add(cb1, NULL); ecore_idler_add(idler, NULL); ecore_idler_add(exit_idle, NULL); ecore_main_loop_begin(); INF("main: end"); return 0; } Author: barbieri Date: 2010-02-23 14:25:35 -0800 (Tue, 23 Feb 2010) New Revision: 46410 Modified: trunk/ecore/src/lib/ecore/ecore_idle_exiter.c Modified: trunk/ecore/src/lib/ecore/ecore_idle_exiter.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_idle_exiter.c 2010-02-23 22:25:31 UTC (rev 46409) +++ trunk/ecore/src/lib/ecore/ecore_idle_exiter.c 2010-02-23 22:25:35 UTC (rev 46410) @@ -16,13 +16,15 @@ { EINA_INLIST; ECORE_MAGIC; - int delete_me : 1; int (*func) (void *data); void *data; + int references; + Eina_Bool delete_me : 1; }; static Ecore_Idle_Exiter *idle_exiters = NULL; +static Ecore_Idle_Exiter *idle_exiter_current = NULL; static int idle_exiters_delete_me = 0; /** @@ -79,36 +81,62 @@ free(ie); } idle_exiters_delete_me = 0; + idle_exiter_current = NULL; } void _ecore_idle_exiter_call(void) { - Ecore_Idle_Exiter *ie; + if (!idle_exiter_current) + { + /* regular main loop, start from head */ + idle_exiter_current = idle_exiters; + } + else + { + /* recursive main loop, continue from where we were */ + idle_exiter_current = + (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next; + } - EINA_INLIST_FOREACH(idle_exiters, ie) + while (idle_exiter_current) { + Ecore_Idle_Exiter *ie = (Ecore_Idle_Exiter *)idle_exiter_current; if (!ie->delete_me) { + ie->references++; if (!ie->func(ie->data)) ecore_idle_exiter_del(ie); + ie->references--; } + if (idle_exiter_current) /* may have changed in recursive main loops */ + idle_exiter_current = + (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next; } if (idle_exiters_delete_me) { Ecore_Idle_Exiter *l; + int deleted_idler_exiters_in_use = 0; + for (l = idle_exiters; l;) { - ie = l; + Ecore_Idle_Exiter *ie = l; l = (Ecore_Idle_Exiter *) EINA_INLIST_GET(l)->next; if (ie->delete_me) { + if (ie->references) + { + deleted_idler_exiters_in_use++; + continue; + } + idle_exiters = (Ecore_Idle_Exiter *) eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); free(ie); } } - idle_exiters_delete_me = 0; + if (!deleted_idler_exiters_in_use) + idle_exiters_delete_me = 0; } } |
From: Enlightenment S. <no-...@en...> - 2010-02-23 22:49:21
|
Log: move bitfield booleans to Eina_Bool. using one bit with integers will just have room for 0 and -1, not 0 and 1. Author: barbieri Date: 2010-02-23 14:49:15 -0800 (Tue, 23 Feb 2010) New Revision: 46412 Modified: trunk/ecore/src/lib/ecore/ecore_events.c trunk/ecore/src/lib/ecore/ecore_exe.c trunk/ecore/src/lib/ecore/ecore_exe_win32.c trunk/ecore/src/lib/ecore/ecore_main.c Modified: trunk/ecore/src/lib/ecore/ecore_events.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_events.c 2010-02-23 22:37:40 UTC (rev 46411) +++ trunk/ecore/src/lib/ecore/ecore_events.c 2010-02-23 22:49:15 UTC (rev 46412) @@ -17,21 +17,21 @@ EINA_INLIST; ECORE_MAGIC; int type; - int delete_me : 1; int (*func) (void *data, int type, void *event); void *data; + Eina_Bool delete_me : 1; }; struct _Ecore_Event_Filter { EINA_INLIST; ECORE_MAGIC; - int delete_me : 1; void *(*func_start) (void *data); int (*func_filter) (void *data, void *loop_data, int type, void *event); void (*func_end) (void *data, void *loop_data); void *loop_data; void *data; + Eina_Bool delete_me : 1; }; struct _Ecore_Event @@ -40,9 +40,9 @@ ECORE_MAGIC; int type; void *event; - int delete_me : 1; void (*func_free) (void *data, void *ev); void *data; + Eina_Bool delete_me : 1; }; Modified: trunk/ecore/src/lib/ecore/ecore_exe.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_exe.c 2010-02-23 22:37:40 UTC (rev 46411) +++ trunk/ecore/src/lib/ecore/ecore_exe.c 2010-02-23 22:49:15 UTC (rev 46412) @@ -114,7 +114,7 @@ int child_fd_write_x; /* fd to write TO to send data to the child */ int child_fd_read_x; /* fd to read FROM when child has sent us (the parent) data */ int child_fd_error_x; /* fd to read FROM when child has sent us (the parent) errors */ - int close_stdin; + Eina_Bool close_stdin : 1; int start_bytes, end_bytes, start_lines, end_lines; /* Number of bytes/lines to auto pipe at start/end of stdout/stderr. */ Modified: trunk/ecore/src/lib/ecore/ecore_exe_win32.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_exe_win32.c 2010-02-23 22:37:40 UTC (rev 46411) +++ trunk/ecore/src/lib/ecore/ecore_exe_win32.c 2010-02-23 22:49:15 UTC (rev 46412) @@ -79,8 +79,8 @@ int data_size; int pending; } pipe_error; - int close_stdin; - int is_suspended : 1; + Eina_Bool close_stdin : 1; + Eina_Bool is_suspended : 1; void (*pre_free_cb)(void *data, const Ecore_Exe *exe); }; Modified: trunk/ecore/src/lib/ecore/ecore_main.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_main.c 2010-02-23 22:37:40 UTC (rev 46411) +++ trunk/ecore/src/lib/ecore/ecore_main.c 2010-02-23 22:49:15 UTC (rev 46412) @@ -48,16 +48,16 @@ ECORE_MAGIC; int fd; Ecore_Fd_Handler_Flags flags; - int read_active : 1; - int write_active : 1; - int error_active : 1; - int delete_me : 1; int (*func) (void *data, Ecore_Fd_Handler *fd_handler); void *data; int (*buf_func) (void *data, Ecore_Fd_Handler *fd_handler); void *buf_data; void (*prep_func) (void *data, Ecore_Fd_Handler *fd_handler); void *prep_data; + Eina_Bool read_active : 1; + Eina_Bool write_active : 1; + Eina_Bool error_active : 1; + Eina_Bool delete_me : 1; }; #ifdef _WIN32 @@ -68,7 +68,7 @@ HANDLE h; int (*func) (void *data, Ecore_Win32_Handler *win32_handler); void *data; - int delete_me : 1; + Eina_Bool delete_me : 1; }; #endif |