Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Detect socket closed by peer in the transport layer, so that such things don't polute...
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 26 Jun 2006 13:57:20 +0000 (13:57 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 26 Jun 2006 13:57:20 +0000 (13:57 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2433 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/gras/Transport/rl_transport.c
src/gras/Transport/transport.c
src/gras/Transport/transport_plugin_file.c
src/gras/Transport/transport_private.h

index 0a702e2..5b6b6ec 100644 (file)
@@ -160,9 +160,8 @@ gras_socket_t gras_trp_select(double timeout) {
         accepted = (sock_iter->plugin->socket_accept)(sock_iter);
         DEBUG2("accepted=%p,&accepted=%p",accepted,&accepted);
         accepted->meas = sock_iter->meas;
-       } else {
-#if 0 
-       FIXME: this fails of files. quite logical
+
+       } else if (sock_iter->recv_ok) {
         /* Make sure the socket is still alive by reading the first byte */
         char lookahead;
         int recvd;
@@ -171,21 +170,23 @@ gras_socket_t gras_trp_select(double timeout) {
         if (recvd < 0) {
           WARN2("socket %d failed: %s", sock_iter->sd, strerror(errno));
           /* done with this socket */
-          gras_socket_close(&sock_iter);
+          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); 
+          gras_socket_close(sock_iter); 
           cursor--; 
         } else { 
-#endif
           /* Got a suited socket ! */
           XBT_OUT;
           return sock_iter;
-#if 0
         }
-#endif
+
+       } else {
+        /* This is a file socket. Cannot recv() on it, but it must be alive */
+          XBT_OUT;
+          return sock_iter;
        }
 
        
index b495c28..cb7c2e2 100644 (file)
@@ -158,6 +158,7 @@ void gras_trp_socket_new(int incoming,
   sock->outgoing  = incoming ? 0:1;
   sock->accepting = incoming ? 1:0;
   sock->meas = 0;
+  sock->recv_ok = 1;
 
   sock->sd     = -1;
   sock->port      = -1;
index 5642aee..1b55969 100644 (file)
@@ -95,6 +95,7 @@ gras_socket_client_from_file(const char*path) {
     res->sd = 1; /* stdout */
   }
 
+  res->recv_ok=0;
   DEBUG5("sock_client_from_file(%s): sd=%d in=%c out=%c accept=%c",
         path,
         res->sd,
@@ -141,6 +142,7 @@ gras_socket_t gras_socket_server_from_file(const char*path) {
         res->outgoing?'y':'n',
         res->accepting?'y':'n');
 
+  res->recv_ok=0;
   return res;
 }
 
index 9555fbb..88357d6 100644 (file)
@@ -40,6 +40,7 @@ typedef struct s_gras_socket  {
   int outgoing :1; /* true if we can write on this sock */
   int accepting :1; /* true if master incoming sock in tcp */
   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) */
 
   unsigned long int buf_size; /* what to say to the OS. field here to remember it when accepting */