diff --git a/legacy/ecore/src/lib/ecore/Ecore.h b/legacy/ecore/src/lib/ecore/Ecore.h index 21ee10b387..01bc5f0695 100644 --- a/legacy/ecore/src/lib/ecore/Ecore.h +++ b/legacy/ecore/src/lib/ecore/Ecore.h @@ -298,6 +298,7 @@ extern "C" { EAPI void ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags); EAPI Ecore_Win32_Handler *ecore_main_win32_handler_add(void *h, int (*func) (void *data, Ecore_Win32_Handler *wh), const void *data); + EAPI void *ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler); EAPI Ecore_Pipe *ecore_pipe_add(void (*handler) (void *data, void *buffer, unsigned int nbyte), const void *data); EAPI void *ecore_pipe_del(Ecore_Pipe *p); diff --git a/legacy/ecore/src/lib/ecore/ecore.c b/legacy/ecore/src/lib/ecore/ecore.c index 4c0da137ec..b40d0cf920 100644 --- a/legacy/ecore/src/lib/ecore/ecore.c +++ b/legacy/ecore/src/lib/ecore/ecore.c @@ -193,6 +193,9 @@ _ecore_magic_string_get(Ecore_Magic m) case ECORE_MAGIC_FD_HANDLER: return "Ecore_Fd_Handler (Fd Handler)"; break; + case ECORE_MAGIC_WIN32_HANDLER: + return "Ecore_Win32_Handler (Win32 Handler)"; + break; case ECORE_MAGIC_EVENT_HANDLER: return "Ecore_Event_Handler (Event Handler)"; break; diff --git a/legacy/ecore/src/lib/ecore/ecore_main.c b/legacy/ecore/src/lib/ecore/ecore_main.c index ee9c73cf8c..62e5ecfda9 100644 --- a/legacy/ecore/src/lib/ecore/ecore_main.c +++ b/legacy/ecore/src/lib/ecore/ecore_main.c @@ -38,7 +38,9 @@ static int _ecore_main_select(double timeout); static void _ecore_main_fd_handlers_cleanup(void); +#ifndef _WIN32 static void _ecore_main_fd_handlers_bads_rem(void); +#endif static void _ecore_main_fd_handlers_call(void); static int _ecore_main_fd_handlers_buf_call(void); static void _ecore_main_loop_iterate_internal(int once_only); @@ -46,6 +48,7 @@ static void _ecore_main_loop_iterate_internal(int once_only); #ifdef _WIN32 static int _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); +static void _ecore_main_win32_handlers_cleanup(void); #endif static int in_main_loop = 0; @@ -54,6 +57,7 @@ static Ecore_Fd_Handler *fd_handlers = NULL; static int fd_handlers_delete_me = 0; #ifdef _WIN32 static Ecore_Win32_Handler *win32_handlers = NULL; +static int win32_handlers_delete_me = 0; #endif #ifdef _WIN32 @@ -234,6 +238,7 @@ ecore_main_win32_handler_add(void *h, if (!wh) return NULL; ECORE_MAGIC_SET(wh, ECORE_MAGIC_WIN32_HANDLER); wh->h = (HANDLE)h; + wh->delete_me = 0; wh->func = func; wh->data = (void *)data; win32_handlers = (Ecore_Win32_Handler *)eina_inlist_append(EINA_INLIST_GET(win32_handlers), @@ -271,6 +276,28 @@ ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler) return fd_handler->data; } +#ifdef _WIN32 +EAPI void * +ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler) +{ + if (!ECORE_MAGIC_CHECK(win32_handler, ECORE_MAGIC_WIN32_HANDLER)) + { + ECORE_MAGIC_FAIL(win32_handler, ECORE_MAGIC_WIN32_HANDLER, + "ecore_main_win32_handler_del"); + return NULL; + } + win32_handler->delete_me = 1; + win32_handlers_delete_me = 1; + return win32_handler->data; +} +#else +EAPI void * +ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler) +{ + return NULL; +} +#endif + EAPI void ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, void (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data) { @@ -369,6 +396,20 @@ _ecore_main_shutdown(void) free(fdh); } fd_handlers_delete_me = 0; + +#ifdef _WIN32 + while (win32_handlers) + { + Ecore_Win32_Handler *wh; + + wh = win32_handlers; + win32_handlers = (Ecore_Win32_Handler *) eina_inlist_remove(EINA_INLIST_GET(win32_handlers), + EINA_INLIST_GET(wh)); + ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE); + free(wh); + } + win32_handlers_delete_me = 0; +#endif } static int @@ -437,10 +478,7 @@ _ecore_main_select(double timeout) _ecore_loop_time = ecore_time_get(); if (ret < 0) { -#ifdef _WIN32 - fprintf(stderr, "main_loop_select error %d\n", WSAGetLastError()); - if (WSAEINTR == WSAGetLastError()) return -1; -#else +#ifndef _WIN32 if (errno == EINTR) return -1; else if (errno == EBADF) _ecore_main_fd_handlers_bads_rem(); @@ -459,11 +497,15 @@ _ecore_main_select(double timeout) fdh->error_active = 1; } _ecore_main_fd_handlers_cleanup(); +#ifdef _WIN32 + _ecore_main_win32_handlers_cleanup(); +#endif return 1; } return 0; } +#ifndef _WIN32 static void _ecore_main_fd_handlers_bads_rem(void) { @@ -501,6 +543,7 @@ _ecore_main_fd_handlers_bads_rem(void) _ecore_main_fd_handlers_cleanup(); } +#endif static void _ecore_main_fd_handlers_cleanup(void) @@ -526,6 +569,31 @@ _ecore_main_fd_handlers_cleanup(void) fd_handlers_delete_me = 0; } +#ifdef _WIN32 +static void +_ecore_main_win32_handlers_cleanup(void) +{ + Ecore_Win32_Handler *wh; + Eina_Inlist *l; + + if (!win32_handlers_delete_me) return; + for (l = EINA_INLIST_GET(win32_handlers); l; ) + { + wh = (Ecore_Win32_Handler *)l; + + l = l->next; + if (wh->delete_me) + { + win32_handlers = (Ecore_Win32_Handler *)eina_inlist_remove(EINA_INLIST_GET(win32_handlers), + EINA_INLIST_GET(wh)); + ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE); + free(wh); + } + } + win32_handlers_delete_me = 0; +} +#endif + static void _ecore_main_fd_handlers_call(void) { @@ -742,9 +810,9 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, HANDLE objects[MAXIMUM_WAIT_OBJECTS]; int sockets[MAXIMUM_WAIT_OBJECTS]; Ecore_Win32_Handler *wh; - int objects_nbr = 0; - int handles_nbr = 0; - int events_nbr = 0; + unsigned int objects_nbr = 0; + unsigned int handles_nbr = 0; + unsigned int events_nbr = 0; DWORD result; DWORD timeout; MSG msg; @@ -798,7 +866,7 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, else timeout = (DWORD)(tv->tv_sec * 1000.0 + tv->tv_usec / 1000.0); - if (timeout == 0) return; + if (timeout == 0) return 0; result = MsgWaitForMultipleObjects(objects_nbr, (const HANDLE *)objects, FALSE, timeout, QS_ALLINPUT); @@ -815,7 +883,7 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, msg = evil_last_error_get(); printf (" * %s\n", msg); free(msg); - res = 0; + res = -1; } else if (result == WAIT_TIMEOUT) { @@ -852,28 +920,25 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, EINA_INLIST_FOREACH(win32_handlers, wh) { if (objects[result - WAIT_OBJECT_0] == wh->h) - wh->func(wh->data, wh); + if (!wh->delete_me) + if (!wh->func(wh->data, wh)) + { + wh->delete_me = 1; + win32_handlers_delete_me = 1; + } } res = 1; } else { fprintf(stderr, "unknown result...\n"); + res = -1; } /* Remove event objects again */ for(i = 0; i < events_nbr; i++) WSACloseEvent(objects[i]); - /* remove HANDLEs */ - while (win32_handlers) - { - wh = win32_handlers; - win32_handlers = (Ecore_Win32_Handler *)eina_inlist_remove(EINA_INLIST_GET(win32_handlers), - EINA_INLIST_GET(wh)); - free(wh); - } - return res; } #endif diff --git a/legacy/ecore/src/lib/ecore/ecore_private.h b/legacy/ecore/src/lib/ecore/ecore_private.h index eb3249f5fd..b1c7f1fbe1 100644 --- a/legacy/ecore/src/lib/ecore/ecore_private.h +++ b/legacy/ecore/src/lib/ecore/ecore_private.h @@ -338,6 +338,7 @@ struct _Ecore_Win32_Handler HANDLE h; int (*func) (void *data, Ecore_Win32_Handler *win32_handler); void *data; + int delete_me : 1; }; #endif