Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
also fix xbt_dynar_set like xbt_dynar_set_at_ptr by not checking the idx validity...
[simgrid.git] / src / xbt / dynar.c
index 5df4655..cd0ab31 100644 (file)
@@ -390,6 +390,28 @@ XBT_INLINE void *xbt_dynar_get_ptr(const xbt_dynar_t dynar,
   return res;
 }
 
+XBT_INLINE void *xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
+                                      const unsigned long idx)
+{
+
+  void *res;
+  _dynar_lock(dynar);
+  _sanity_check_dynar(dynar);
+
+  _xbt_dynar_expand(dynar, idx + 1);
+
+  if (idx >= dynar->used) {
+    _xbt_clear_mem(((char * const)dynar->data) + dynar->used * dynar->elmsize,
+                   (idx + 1 - dynar->used)*dynar->elmsize);
+    dynar->used = idx + 1;
+  }
+  
+  _dynar_unlock(dynar);
+
+  res = _xbt_dynar_elm(dynar, idx);
+
+  return res;
+}
 
 static void XBT_INLINE          /* not synchronized */
 _xbt_dynar_set(xbt_dynar_t dynar,
@@ -397,11 +419,12 @@ _xbt_dynar_set(xbt_dynar_t dynar,
 {
 
   _sanity_check_dynar(dynar);
-  _sanity_check_idx(idx);
 
   _xbt_dynar_expand(dynar, idx + 1);
 
   if (idx >= dynar->used) {
+    _xbt_clear_mem(((char * const)dynar->data) + dynar->used * dynar->elmsize,
+                   (idx + 1 - dynar->used)*dynar->elmsize);
     dynar->used = idx + 1;
   }
 
@@ -708,6 +731,7 @@ XBT_INLINE void xbt_dynar_cursor_unlock(xbt_dynar_t dynar)
 
 /** @brief Sorts a dynar according to the function <tt>compar_fn</tt>
  *
+ * \param dynar the dynar to sort
  * \param compar_fn comparison function of type (int (compar_fn*) (void*) (void*)).
  *
  * Remark: if the elements stored in the dynar are structures, the compar_fn