with this tiny optimisation on BillWare */
fd_set FDS;
int ready; /* return of select: number of socket ready to be serviced */
- int fd_setsize; /* FD_SETSIZE not always defined. Get this portably */
+ static int fd_setsize=-1; /* FD_SETSIZE not always defined. Get this portably */
gras_socket_t sock_iter; /* iterating over all sockets */
int cursor; /* iterating over all sockets */
return _gras_lastly_selected_socket;
}
- /* Compute FD_SETSIZE */
+ /* Compute FD_SETSIZE on need */
+ if (fd_setsize < 0) {
#ifdef HAVE_SYSCONF
- fd_setsize = sysconf( _SC_OPEN_MAX );
+ fd_setsize = sysconf( _SC_OPEN_MAX );
#else
# ifdef HAVE_GETDTABLESIZE
- fd_setsize = getdtablesize();
+ fd_setsize = getdtablesize();
# else
- fd_setsize = FD_SETSIZE;
+ fd_setsize = FD_SETSIZE;
# endif /* !USE_SYSCONF */
#endif
+ }
while (done == -1) {
if (timeout > 0) { /* did we timeout already? */
#ifndef HAVE_WINSOCK_H
if (max_fds < sock_iter->sd)
max_fds = sock_iter->sd;
+#else
+ max_fds = 0;
+
#endif
FD_SET(sock_iter->sd, &FDS);
} else {
/* not a socket but an ear. accept on it and serve next socket */
gras_socket_t accepted=NULL;
+ /* release mutex before accept */
accepted = (sock_iter->plugin->socket_accept)(sock_iter);
+
DEBUG2("accepted=%p,&accepted=%p",accepted,&accepted);
accepted->meas = sock_iter->meas;
/* Got a suited socket ! */
XBT_OUT;
_gras_lastly_selected_socket = sock_iter;
+ /* break sync dynar iteration */
+ xbt_dynar_cursor_unlock(sockets);
return sock_iter;
}
/* This is a file socket. Cannot recv() on it, but it must be alive */
XBT_OUT;
_gras_lastly_selected_socket = sock_iter;
+ xbt_dynar_cursor_unlock(sockets);
return sock_iter;
}
/* if we're here, the socket we found wasn't really ready to be served */
- if (ready == 0) /* exausted all sockets given by select. Request new ones */
- break;
+ if (ready == 0) { /* exausted all sockets given by select. Request new ones */
+
+ xbt_dynar_cursor_unlock(sockets);
+ break;
+ }
}
}