diff --git a/legacy/ecore/src/lib/ecore/ecore_main.c b/legacy/ecore/src/lib/ecore/ecore_main.c index ec0ad04b78..7c53bfd116 100644 --- a/legacy/ecore/src/lib/ecore/ecore_main.c +++ b/legacy/ecore/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;