summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
13bf534)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2671
48e7efb5-ca39-0410-a469-
dd3cf9ba447f
gras_socket_t sock_iter; /* iterating over all sockets */
int cursor; /* iterating over all sockets */
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 );
/* 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) {
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);
THROW1(timeout_error,0,
"Timeout (%f) elapsed with selecting for incomming connexions",
timeout);
} else {
/* Got a suited socket ! */
XBT_OUT;
} 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;
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;
sock->meas = 0;
sock->recv_ok = 1;
sock->valid = 1;
sock->meas = 0;
sock->recv_ok = 1;
sock->valid = 1;
sock->sd = -1;
sock->port = -1;
sock->sd = -1;
sock->port = -1;
+ /* indicate to the gras_select function that there is more to read on this socket so that it does not actually select */
+ sock->moredata = (bufsize != 0);
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 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 */
unsigned long int buf_size; /* what to say to the OS. field here to remember it when accepting */