Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
declaration of the variables at the begining of the function
[simgrid.git] / src / xbt / dynar.c
index e4a4a29..8414788 100644 (file)
@@ -53,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) {
@@ -124,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",
@@ -184,11 +223,11 @@ xbt_dynar_free_container(xbt_dynar_t *dynar) {
       free((*dynar)->data);
     }
 
-    _xbt_clear_mem(*dynar, sizeof(s_xbt_dynar_t));
-
     if ((*dynar)->mutex) 
        xbt_mutex_destroy((*dynar)->mutex);
      
+    _xbt_clear_mem(*dynar, sizeof(s_xbt_dynar_t));
+
     free(*dynar);
     *dynar=NULL;
   }
@@ -387,17 +426,20 @@ static XBT_INLINE void *
 _xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar,
                        const int            idx) {
    void *res;
+   unsigned long old_used;
+   unsigned long new_used;
+   unsigned long nb_shift;
    
   _sanity_check_dynar(dynar);
   _sanity_check_idx(idx);
   _check_sloppy_inbound_idx(dynar, idx);
 
-  const unsigned long old_used = dynar->used;
-  const unsigned long new_used = old_used + 1;
+  old_used = dynar->used;
+  new_used = old_used + 1;
 
   _xbt_dynar_expand(dynar, new_used);
 
-  const unsigned long nb_shift =  old_used - idx;
+  nb_shift =  old_used - idx;
 
   if (nb_shift)
      memmove(_xbt_dynar_elm(dynar, idx+1), 
@@ -458,37 +500,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);
 }
 
@@ -510,6 +523,7 @@ xbt_dynar_search(xbt_dynar_t  const dynar,
    
   _dynar_unlock(dynar);
   THROW2(not_found_error,0,"Element %p not part of dynar %p",elem,dynar);
+  return -1;
 }
 
 /** @brief Returns a boolean indicating whether the element is part of the dynar */
@@ -691,7 +705,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
@@ -1156,8 +1170,8 @@ XBT_TEST_UNIT("synchronized int",test_dynar_sync_int,"Synchronized dynars of int
    
    xbt_test_add0("==== Have a pusher and a popper on the dynar");
    d=xbt_dynar_new_sync(sizeof(int),NULL);
-   pusher = xbt_thread_create(pusher_f,d);
-   poper = xbt_thread_create(poper_f,d);
+   pusher = xbt_thread_create("pusher",pusher_f,d);
+   poper = xbt_thread_create("poper",poper_f,d);
    xbt_thread_join(pusher);
    xbt_thread_join(poper);
    xbt_dynar_free(&d);