Commit f951deec authored by Dmitriy Anisimkov's avatar Dmitriy Anisimkov Committed by Alexandre Julliard

ws2_32: Ignore EINTR poll result code in WS_select.

parent 7fa618aa
...@@ -2883,6 +2883,8 @@ int WINAPI WS_select(int nfds, WS_fd_set *ws_readfds, ...@@ -2883,6 +2883,8 @@ int WINAPI WS_select(int nfds, WS_fd_set *ws_readfds,
const struct WS_timeval* ws_timeout) const struct WS_timeval* ws_timeout)
{ {
struct pollfd *pollfds; struct pollfd *pollfds;
struct timeval tv1, tv2;
int torig = 0;
int count, ret, timeout = -1; int count, ret, timeout = -1;
TRACE("read %p, write %p, excp %p timeout %p\n", TRACE("read %p, write %p, excp %p timeout %p\n",
...@@ -2894,9 +2896,32 @@ int WINAPI WS_select(int nfds, WS_fd_set *ws_readfds, ...@@ -2894,9 +2896,32 @@ int WINAPI WS_select(int nfds, WS_fd_set *ws_readfds,
return SOCKET_ERROR; return SOCKET_ERROR;
} }
if (ws_timeout) timeout = (ws_timeout->tv_sec * 1000) + (ws_timeout->tv_usec + 999) / 1000; if (ws_timeout)
{
torig = (ws_timeout->tv_sec * 1000) + (ws_timeout->tv_usec + 999) / 1000;
timeout = torig;
gettimeofday( &tv1, 0 );
}
while ((ret = poll( pollfds, count, timeout )) < 0)
{
if (errno == EINTR)
{
if (!ws_timeout) continue;
gettimeofday( &tv2, 0 );
ret = poll( pollfds, count, timeout ); tv2.tv_sec -= tv1.tv_sec;
tv2.tv_usec -= tv1.tv_usec;
if (tv2.tv_usec < 0)
{
tv2.tv_usec += 1000000;
tv2.tv_sec -= 1;
}
timeout = torig - (tv2.tv_sec * 1000) - (tv2.tv_usec + 999) / 1000;
if (timeout <= 0) break;
} else break;
}
release_poll_fds( ws_readfds, ws_writefds, ws_exceptfds, pollfds ); release_poll_fds( ws_readfds, ws_writefds, ws_exceptfds, pollfds );
if (ret == -1) SetLastError(wsaErrno()); if (ret == -1) SetLastError(wsaErrno());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment