Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Do not use recv() but read() to check whether a socket returned by select() is valid...
[simgrid.git] / src / gras / Transport / transport.c
index 8c028e4..ad39c5c 100644 (file)
@@ -153,7 +153,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->recvd = 0;
   sock->valid = 1;
   sock->moredata = 0;
 
@@ -168,8 +168,6 @@ void gras_trp_socket_new(int incoming,
   
   *dst = sock;
 
-  xbt_dynar_push(((gras_trp_procdata_t) 
-                 gras_libdata_by_id(gras_trp_libdata_id))->sockets,dst);
   XBT_OUT;
 }
  
@@ -212,19 +210,15 @@ gras_socket_server_ext(unsigned short port,
           sock->outgoing?'y':'n',
           sock->accepting?'y':'n');
   } CATCH(e) {
-    int cursor;
-    gras_socket_t sock_iter;
-    xbt_dynar_t socks = ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets;
-    xbt_dynar_foreach(socks, cursor, sock_iter) {
-       if (sock_iter==sock) 
-        xbt_dynar_cursor_rm(socks,&cursor);
-    }     
+
     free(sock);
     RETHROW;
   }
 
   if (!measurement)
      ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->myport = port;
+  xbt_dynar_push(((gras_trp_procdata_t) 
+                 gras_libdata_by_id(gras_trp_libdata_id))->sockets,&sock);
   return sock;
 }
 /**
@@ -298,12 +292,11 @@ gras_socket_client_ext(const char *host,
           sock->outgoing?'y':'n',
           sock->accepting?'y':'n');
   } CATCH(e) {
-     xbt_dynar_pop(((gras_trp_procdata_t)
-                   gras_libdata_by_id(gras_trp_libdata_id))->sockets,NULL);
      free(sock);
-    RETHROW;
+     RETHROW;
   }
-
+  xbt_dynar_push(((gras_trp_procdata_t) 
+                 gras_libdata_by_id(gras_trp_libdata_id))->sockets,&sock);
   return sock;
 }
 
@@ -337,7 +330,7 @@ gras_socket_client_from_string(const char *host) {
 /** \brief Close socket */
 void gras_socket_close(gras_socket_t sock) {
   xbt_dynar_t sockets = ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets;
-  gras_socket_t sock_iter;
+  gras_socket_t sock_iter = NULL;
   int cursor;
 
   XBT_IN;
@@ -354,7 +347,10 @@ void gras_socket_close(gras_socket_t sock) {
   /* FIXME: Issue an event when the socket is closed */
        DEBUG1("sockets pointer before %p",sockets);
   if (sock) {
-               xbt_dynar_foreach(sockets,cursor,sock_iter) {
+       /* FIXME: Cannot get the dynar mutex, because it can be already locked */
+//             _xbt_dynar_foreach(sockets,cursor,sock_iter) {
+               for (cursor=0; cursor< xbt_dynar_length(sockets); cursor++)  {
+                       _xbt_dynar_cursor_get(sockets,&cursor,&sock_iter);
                        if (sock == sock_iter) {
                                DEBUG2("remove sock cursor %d dize %lu\n",cursor,xbt_dynar_length(sockets));
                                xbt_dynar_cursor_rm(sockets,&cursor);
@@ -370,7 +366,7 @@ void gras_socket_close(gras_socket_t sock) {
                        }
     }
     WARN1("Ignoring request to free an unknown socket (%p). Execution stack:",sock);
-    xbt_backtrace_display();
+    xbt_backtrace_display_current();
   }
   XBT_OUT;
 }
@@ -567,7 +563,7 @@ static void *gras_trp_procdata_new() {
    
    res->name = xbt_strdup("gras_trp");
    res->name_len = 0;
-   res->sockets = xbt_dynar_new(sizeof(gras_socket_t*), NULL);
+   res->sockets = xbt_dynar_new_sync(sizeof(gras_socket_t*), NULL);
    res->myport = 0;
    
    return (void*)res;