Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Undo dynar changes ("recursive" mutex).
authordonassbr <donassbr@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 16 Jul 2007 13:33:49 +0000 (13:33 +0000)
committerdonassbr <donassbr@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 16 Jul 2007 13:33:49 +0000 (13:33 +0000)
Added functions to remove data if we're inside of foreach.

Changes in gras to work with the "sync dynar". I tested only with some
SG examples.

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3802 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/gras/Transport/rl_transport.c
src/gras/Transport/transport.c
src/xbt/dynar.c
src/xbt/dynar_private.h

index e96d675..031c1e6 100644 (file)
@@ -175,10 +175,12 @@ gras_socket_t gras_trp_select(double timeout) {
         gras_socket_t accepted=NULL;
         
         /* release mutex before accept */
+        xbt_dynar_cursor_unlock(sockets);
         accepted = (sock_iter->plugin->socket_accept)(sock_iter);
 
         DEBUG2("accepted=%p,&accepted=%p",accepted,&accepted);
         accepted->meas = sock_iter->meas;
+        break;
 
        } else if (sock_iter->recv_ok) {
         /* Make sure the socket is still alive by reading the first byte */
index 4f5fe77..27f5274 100644 (file)
@@ -338,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;
@@ -355,7 +355,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);
@@ -367,7 +370,6 @@ void gras_socket_close(gras_socket_t sock) {
                                        free(sock->peer_name);
                                free(sock);
                                XBT_OUT;
-                               xbt_dynar_cursor_unlock(sockets);
                                return;
                        }
     }
index 1d8786f..df177bf 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn,xbt,"Dynamic arrays");
 
-
+#define _dynar_lock(dynar) \
+           if (dynar->mutex) \
+              xbt_mutex_lock(dynar->mutex)
+#define _dynar_unlock(dynar) \
+           if (dynar->mutex) \
+              xbt_mutex_unlock(dynar->mutex)
 #define _sanity_check_dynar(dynar)       \
            xbt_assert0(dynar,           \
                        "dynar is NULL")
@@ -48,6 +53,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn,xbt,"Dynamic arrays");
              THROW1(bound_error,0,            \
                     "dynar %p is empty", dynar)
 
+
 static XBT_INLINE 
 void _xbt_clear_mem(void * const ptr,
                     const unsigned long length) {
@@ -119,6 +125,44 @@ _xbt_dynar_put_elm(const xbt_dynar_t  dynar,
   memcpy(elm, src, elmsize);
 }
 
+static XBT_INLINE 
+void
+_xbt_dynar_remove_at(xbt_dynar_t  const dynar,
+                     const int            idx,
+                     void         * const object) {
+
+  unsigned long nb_shift;
+  unsigned long offset;
+
+  _sanity_check_dynar(dynar);
+  _sanity_check_idx(idx);
+  _check_inbound_idx(dynar, idx);
+
+  if (object) {
+    _xbt_dynar_get_elm(object, dynar, idx);
+  } else if (dynar->free_f) {
+    if (dynar->elmsize <= SIZEOF_MAX) {
+       char elm[SIZEOF_MAX];
+       _xbt_dynar_get_elm(elm, dynar, idx);
+       (*dynar->free_f)(elm);
+    } else {
+       char *elm=malloc(dynar->elmsize);
+       _xbt_dynar_get_elm(elm, dynar, idx);
+       (*dynar->free_f)(elm);
+       free(elm);
+    }
+  }
+
+  nb_shift =  dynar->used-1 - idx;
+  offset   =  nb_shift * dynar->elmsize;
+
+  memmove(_xbt_dynar_elm(dynar, idx),
+          _xbt_dynar_elm(dynar, idx+1), 
+          offset);
+
+  dynar->used--;
+}
+
 void
 xbt_dynar_dump(xbt_dynar_t dynar) {
   INFO5("Dynar dump: size=%lu; used=%lu; elmsize=%lu; data=%p; free_f=%p",
@@ -160,7 +204,6 @@ xbt_dynar_new_sync(const unsigned long elmsize,
                void_f_pvoid_t * const free_f) {
    xbt_dynar_t res = xbt_dynar_new(elmsize,free_f);
    res->mutex = xbt_mutex_init();
-   res->synchro_process_pid = -1;
    return res;
 }
 
@@ -454,37 +497,8 @@ xbt_dynar_remove_at(xbt_dynar_t  const dynar,
                      const int            idx,
                      void         * const object) {
 
-  unsigned long nb_shift;
-  unsigned long offset;
-
   _dynar_lock(dynar);
-  _sanity_check_dynar(dynar);
-  _sanity_check_idx(idx);
-  _check_inbound_idx(dynar, idx);
-
-  if (object) {
-    _xbt_dynar_get_elm(object, dynar, idx);
-  } else if (dynar->free_f) {
-    if (dynar->elmsize <= SIZEOF_MAX) {
-       char elm[SIZEOF_MAX];
-       _xbt_dynar_get_elm(elm, dynar, idx);
-       (*dynar->free_f)(elm);
-    } else {
-       char *elm=malloc(dynar->elmsize);
-       _xbt_dynar_get_elm(elm, dynar, idx);
-       (*dynar->free_f)(elm);
-       free(elm);
-    }
-  }
-
-  nb_shift =  dynar->used-1 - idx;
-  offset   =  nb_shift * dynar->elmsize;
-
-  memmove(_xbt_dynar_elm(dynar, idx),
-          _xbt_dynar_elm(dynar, idx+1), 
-          offset);
-
-  dynar->used--;
+       _xbt_dynar_remove_at(dynar, idx, object);
   _dynar_unlock(dynar);
 }
 
@@ -687,7 +701,7 @@ _xbt_dynar_cursor_get(const xbt_dynar_t dynar,
 void xbt_dynar_cursor_rm(xbt_dynar_t dynar,
                          int          * const cursor) {
   
-  xbt_dynar_remove_at(dynar,(*cursor)--,NULL);
+  _xbt_dynar_remove_at(dynar,(*cursor)--,NULL);
 }
 
 /** @brief Unlocks a synchronized dynar when you want to break the traversal
@@ -700,20 +714,6 @@ void xbt_dynar_cursor_unlock(xbt_dynar_t dynar) {
   _dynar_unlock(dynar);
 }
 
-void _dynar_lock(xbt_dynar_t dynar) {
-       if ( (dynar->mutex) && (dynar->synchro_process_pid != xbt_getpid()) ) {
-               xbt_mutex_lock(dynar->mutex);
-               dynar->synchro_process_pid = xbt_getpid();
-       }
-
-}
-void _dynar_unlock(xbt_dynar_t dynar) {
-       if (dynar->mutex) {
-               xbt_mutex_unlock(dynar->mutex);
-               dynar->synchro_process_pid = -1;
-       }
-}
-
 #ifdef SIMGRID_TEST
 
 #define NB_ELEM 5000
index 1bcbac5..46ad623 100644 (file)
@@ -18,9 +18,6 @@ typedef struct xbt_dynar_s {
   void           *data;
   void_f_pvoid_t *free_f;
   xbt_mutex_t    mutex;
-       int synchro_process_pid;
 } s_xbt_dynar_t;
 
-void _dynar_unlock(xbt_dynar_t);
-void _dynar_lock(xbt_dynar_t dynar);
 #endif /* DYNAR_PRIVATE_H */