forked from enlightenment/efl
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... SVN revision: 48807
This commit is contained in:
parent
af63e9e4e7
commit
141a2bb9a8
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue