gras_socket_t sock_iter; /* iterating over all sockets */
int cursor; /* iterating over all sockets */
-
+ /* Check whether there is more data to read from the socket we selected last time.
+ This can happen with tcp buffered sockets since we try to get as much data as we can for them */
+ static gras_socket_t _lastly_selected_socket = NULL;
+ if (_lastly_selected_socket && _lastly_selected_socket->moredata)
+ return _lastly_selected_socket;
+
/* Compute FD_SETSIZE */
#ifdef HAVE_SYSCONF
fd_setsize = sysconf( _SC_OPEN_MAX );
now = gras_os_time();
DEBUG2("wakeup=%f now=%f",wakeup, now);
if (now == -1 || now >= wakeup) {
- /* didn't find anything */
+ /* didn't find anything; no need to update _lastly_selected_socket since its moredata is 0 (or we would have returned it directly) */
THROW1(timeout_error,0,
"Timeout (%f) elapsed with selecting for incomming connexions",
timeout);
} else {
/* Got a suited socket ! */
XBT_OUT;
+ _lastly_selected_socket = sock_iter;
return sock_iter;
}
} else {
/* This is a file socket. Cannot recv() on it, but it must be alive */
XBT_OUT;
+ _lastly_selected_socket = sock_iter;
return sock_iter;
}