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;
}
int meas :1; /* true if this is an experiment socket instead of messaging */
int recv_ok :1; /* true if it is valid to recv() on the socket (false if it is a file) */
int valid :1; /* false if a select returned that the peer quitted, forcing us to "close" the socket */
+ int moredata :1; /* TCP socket use a buffer and read operation get as much data as possible.
+ It is possible that several messages are received in one shoot, and select won't catch them afterward again.
+ This boolean indicates that this is the case, so that we don't call select in that case. */
unsigned long int buf_size; /* what to say to the OS. field here to remember it when accepting */