- xbt_dynar_foreach(sockets,cursor,sock_iter) {
- if(!FD_ISSET(sock_iter->sd, &FDS)) { /* this socket is not ready */
- continue;
- }
-
- /* Got a socket to serve */
- ready--;
-
- if ( sock_iter->accepting
- && sock_iter->plugin->socket_accept) {
- /* not a socket but an ear. accept on it and serve next socket */
- gras_socket_t accepted=NULL;
-
- DEBUG2("accepted=%p,&accepted=%p",accepted,&accepted);
- TRY((sock_iter->plugin->socket_accept)(sock_iter,&accepted));
- accepted->raw = sock_iter->raw;
- } else {
-#if 0
- FIXME: this fails of files. quite logical
- /* Make sure the socket is still alive by reading the first byte */
- char lookahead;
- int recvd;
-
- recvd = recv(sock_iter->sd, &lookahead, 1, MSG_PEEK);
- if (recvd < 0) {
- WARN2("socket %d failed: %s", sock_iter->sd, strerror(errno));
- /* done with this socket */
- gras_socket_close(&sock_iter);
- cursor--;
- } else if (recvd == 0) {
- /* Connection reset (=closed) by peer. */
- DEBUG1("Connection %d reset by peer", sock_iter->sd);
- gras_socket_close(&sock_iter);
- cursor--;
- } else {
-#endif
- /* Got a suited socket ! */
- *dst = sock_iter;
- XBT_OUT;
- return no_error;
-#if 0
- }
-#endif
- }
+ xbt_dynar_foreach(sockets, cursor, sock_iter) {
+ if (!FD_ISSET(sock_iter->sd, &FDS)) { /* this socket is not ready */
+ continue;
+ }
+
+ /* Got a socket to serve */
+ ready--;
+
+ if (sock_iter->accepting && sock_iter->plugin->socket_accept) {
+ /* not a socket but an ear. accept on it and serve next socket */
+ gras_socket_t accepted = NULL;
+
+ /* release mutex before accept; it will change the sockets dynar, so we have to break the foreach asap */
+ xbt_dynar_cursor_unlock(sockets);
+ accepted = (sock_iter->plugin->socket_accept) (sock_iter);
+
+ XBT_DEBUG("accepted=%p,&accepted=%p", accepted, &accepted);
+ accepted->meas = sock_iter->meas;
+ break;