From 43632650b2d5228f28a49947de541c78d80f9643 Mon Sep 17 00:00:00 2001 From: caro Date: Thu, 13 May 2010 08:10:17 +0000 Subject: [PATCH] fix the Windows select function: * On Windows, the values returned by pipe() are sockets. Hence they can be huge. Iterate over the list of "fds" instead of the max value * In the loop which iterates over the win32 handlers, we never go to the next element, so infinite loop... git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/ecore@48807 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/ecore/ecore_main.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index ec0ad04..7c53bfd 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -915,11 +915,12 @@ _ecore_main_loop_iterate_internal(int once_only) #ifdef _WIN32 static int -_ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, +_ecore_main_win32_select(int nfds __UNUSED__, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *tv) { HANDLE objects[MAXIMUM_WAIT_OBJECTS]; int sockets[MAXIMUM_WAIT_OBJECTS]; + Ecore_Fd_Handler *fdh; Ecore_Win32_Handler *wh; unsigned int objects_nbr = 0; unsigned int handles_nbr = 0; @@ -927,29 +928,29 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, DWORD result; DWORD timeout; MSG msg; - int i; + unsigned int i; int res; /* Create an event object per socket */ - for(i = 0; i < nfds; i++) + EINA_INLIST_FOREACH(fd_handlers, fdh) { WSAEVENT event; long network_event; network_event = 0; - if(FD_ISSET(i, readfds)) + if(FD_ISSET(fdh->fd, readfds)) network_event |= FD_READ; - if(FD_ISSET(i, writefds)) + if(FD_ISSET(fdh->fd, writefds)) network_event |= FD_WRITE; - if(FD_ISSET(i, exceptfds)) + if(FD_ISSET(fdh->fd, exceptfds)) network_event |= FD_OOB; if(network_event) { event = WSACreateEvent(); - WSAEventSelect(i, event, network_event); + WSAEventSelect(fdh->fd, event, network_event); objects[objects_nbr] = event; - sockets[events_nbr] = i; + sockets[events_nbr] = fdh->fd; events_nbr++; objects_nbr++; } @@ -1028,7 +1029,6 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, } else if ((result >= WAIT_OBJECT_0 + events_nbr) && (result < WAIT_OBJECT_0 + objects_nbr)) { - if (!win32_handler_current) { /* regular main loop, start from head */ @@ -1055,6 +1055,9 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, } wh->references--; } + + if (win32_handler_current) /* may have changed in recursive main loops */ + win32_handler_current = (Ecore_Win32_Handler *)EINA_INLIST_GET(win32_handler_current)->next; } res = 1; } @@ -1065,7 +1068,7 @@ _ecore_main_win32_select(int nfds, fd_set *readfds, fd_set *writefds, } /* Remove event objects again */ - for(i = 0; i < (int)events_nbr; i++) + for(i = 0; i < events_nbr; i++) WSACloseEvent(objects[i]); return res; -- 2.7.4