Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix a god damn race condition: make sure nobody changes the dynar->used value before...
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 7 Mar 2008 21:32:52 +0000 (21:32 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 7 Mar 2008 21:32:52 +0000 (21:32 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@5283 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/xbt/dynar.c

index f6b45ce..f29b280 100644 (file)
@@ -553,15 +553,27 @@ xbt_dynar_member(xbt_dynar_t  const dynar,
  */
 void *
 xbt_dynar_push_ptr(xbt_dynar_t  const dynar) {
-  return xbt_dynar_insert_at_ptr(dynar, dynar->used);    
+  void *res;
+
+  /* we have to inline xbt_dynar_insert_at_ptr here to make sure that 
+    dynar->used don't change between reading it and getting the lock 
+   within xbt_dynar_insert_at_ptr */
+  _dynar_lock(dynar);
+  res = _xbt_dynar_insert_at_ptr(dynar,dynar->used);
+  _dynar_unlock(dynar);
+  return res;
 }
 
 /** @brief Add an element at the end of the dynar */
 void
 xbt_dynar_push(xbt_dynar_t  const dynar,
                 const void   * const src) {
-  /* sanity checks done by insert_at */
-  xbt_dynar_insert_at(dynar, dynar->used, src); 
+  _dynar_lock(dynar);
+  /* checks done in xbt_dynar_insert_at_ptr */
+  memcpy(_xbt_dynar_insert_at_ptr(dynar,dynar->used),
+        src,
+        dynar->elmsize);
+  _dynar_unlock(dynar);
 }
 
 /** @brief Mark the last dynar's element as unused and return a pointer to it.
@@ -589,7 +601,9 @@ xbt_dynar_pop(xbt_dynar_t  const dynar,
 
   /* sanity checks done by remove_at */
   DEBUG1("Pop %p",(void*)dynar);
-  xbt_dynar_remove_at(dynar, dynar->used-1, dst);
+  _dynar_lock(dynar);
+  _xbt_dynar_remove_at(dynar, dynar->used-1, dst);
+  _dynar_unlock(dynar);
 }
 
 /** @brief Add an element at the begining of the dynar.