Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Undo dynar changes ("recursive" mutex).
[simgrid.git] / src / gras / Transport / transport.c
index 134b418..27f5274 100644 (file)
@@ -97,10 +97,7 @@ void gras_trp_init(void){
 
 void
 gras_trp_exit(void){
-  xbt_dynar_t sockets = ((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets;
-  gras_socket_t sock_iter;
-  int cursor;
-
+   DEBUG1("gras_trp value %d",_gras_trp_started);
    if (_gras_trp_started == 0) {
       return;
    }
@@ -115,13 +112,6 @@ gras_trp_exit(void){
        }
 #endif
 
-      /* Close all the sockets */
-      xbt_dynar_foreach(sockets,cursor,sock_iter) {
-       VERB1("Closing the socket %p left open on exit. Maybe a socket leak?",
-             sock_iter);
-       gras_socket_close(sock_iter);
-      }
-      
       /* Delete the plugins */
       xbt_dict_free(&_gras_trp_plugins);
    }
@@ -226,8 +216,9 @@ gras_socket_server_ext(unsigned short port,
     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);
+       if (sock_iter==sock) {
+                                xbt_dynar_cursor_rm(socks,&cursor);
+                        }
     }     
     free(sock);
     RETHROW;
@@ -308,7 +299,9 @@ gras_socket_client_ext(const char *host,
           sock->outgoing?'y':'n',
           sock->accepting?'y':'n');
   } CATCH(e) {
-    free(sock);
+     xbt_dynar_pop(((gras_trp_procdata_t)
+                   gras_libdata_by_id(gras_trp_libdata_id))->sockets,NULL);
+     free(sock);
     RETHROW;
   }
 
@@ -345,7 +338,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;
@@ -360,23 +353,28 @@ 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) {
-      if (sock == sock_iter) {
-       xbt_dynar_cursor_rm(sockets,&cursor);
-       if (sock->plugin->socket_close) 
-         (* sock->plugin->socket_close)(sock);
-
-       /* free the memory */
-       if (sock->peer_name)
-         free(sock->peer_name);
-       free(sock);
-       XBT_OUT;
-       return;
-      }
+       /* 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);
+                               if (sock->plugin->socket_close) 
+                                       (* sock->plugin->socket_close)(sock);
+
+                               /* free the memory */
+                               if (sock->peer_name)
+                                       free(sock->peer_name);
+                               free(sock);
+                               XBT_OUT;
+                               return;
+                       }
     }
     WARN1("Ignoring request to free an unknown socket (%p). Execution stack:",sock);
-    xbt_backtrace_display();
+    xbt_backtrace_display_current();
   }
   XBT_OUT;
 }
@@ -573,7 +571,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;