Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Fri, 17 Jun 2016 07:41:54 +0000 (09:41 +0200)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Fri, 17 Jun 2016 07:41:54 +0000 (09:41 +0200)
examples/msg/actions-comm/actions-comm.c
include/simgrid/simix.h
src/simix/smx_synchro.cpp
src/simix/smx_synchro_private.h
src/xbt/xbt_os_synchro.c

index 86486d2..0e02194 100644 (file)
@@ -182,7 +182,7 @@ static void action_barrier(const char *const *action)
 
   processes_arrived_sofar--;
   if (processes_arrived_sofar<=0) {
-    SIMIX_cond_destroy(cond);
+    SIMIX_cond_unref(cond);
     SIMIX_mutex_unref(mutex);
     mutex = NULL;
   }
index e95b78c..ebd2598 100644 (file)
@@ -383,7 +383,7 @@ XBT_PUBLIC(int) simcall_mutex_trylock(smx_mutex_t mutex);
 XBT_PUBLIC(void) simcall_mutex_unlock(smx_mutex_t mutex);
 
 XBT_PUBLIC(smx_cond_t) simcall_cond_init(void);
-XBT_PUBLIC(void) SIMIX_cond_destroy(smx_cond_t cond);
+XBT_PUBLIC(void) SIMIX_cond_unref(smx_cond_t cond);
 XBT_PUBLIC(void) simcall_cond_signal(smx_cond_t cond);
 XBT_PUBLIC(void) simcall_cond_wait(smx_cond_t cond, smx_mutex_t mutex);
 XBT_PUBLIC(void) simcall_cond_wait_timeout(smx_cond_t cond,
index 0d53762..3817b17 100644 (file)
@@ -240,6 +240,8 @@ smx_cond_t SIMIX_cond_init(void)
   smx_cond_t cond = xbt_new0(s_smx_cond_t, 1);
   cond->sleeping = xbt_swag_new(xbt_swag_offset(p, synchro_hookup));
   cond->mutex = nullptr;
+  cond->refcount_ = 1;
+  intrusive_ptr_add_ref(cond);
   XBT_OUT();
   return cond;
 }
@@ -356,19 +358,34 @@ void SIMIX_cond_broadcast(smx_cond_t cond)
  * Destroys and frees the condition's memory. 
  * \param cond A condition
  */
-void SIMIX_cond_destroy(smx_cond_t cond)
+void SIMIX_cond_unref(smx_cond_t cond)
 {
   XBT_IN("(%p)",cond);
   XBT_DEBUG("Destroy condition %p", cond);
-
   if (cond != nullptr) {
+    intrusive_ptr_release(cond);
+  }
+  XBT_OUT();
+}
+
+
+void intrusive_ptr_add_ref(s_smx_cond_t *cond)
+{
+  auto previous = (cond->refcount_)++;
+  xbt_assert(previous != 0);
+  (void) previous;
+}
+
+void intrusive_ptr_release(s_smx_cond_t *cond)
+{
+  auto count = --(cond->refcount_);
+  if (count == 0) {
     xbt_assert(xbt_swag_size(cond->sleeping) == 0,
                 "Cannot destroy conditional since someone is still using it");
 
     xbt_swag_free(cond->sleeping);
     xbt_free(cond);
   }
-  XBT_OUT();
 }
 
 /******************************** Semaphores **********************************/
index d9d0391..943e1ad 100644 (file)
@@ -58,6 +58,7 @@ private:
 typedef struct s_smx_cond {
   smx_mutex_t mutex;
   xbt_swag_t sleeping;          /* list of sleeping process */
+  std::atomic_int_fast32_t refcount_;
 } s_smx_cond_t;
 
 typedef struct s_smx_sem {
@@ -79,4 +80,6 @@ XBT_PRIVATE void SIMIX_sem_release(smx_sem_t sem);
 XBT_PRIVATE int SIMIX_sem_would_block(smx_sem_t sem);
 XBT_PRIVATE int SIMIX_sem_get_capacity(smx_sem_t sem);
 
+XBT_PRIVATE void intrusive_ptr_release(s_smx_cond_t *cond);
+XBT_PRIVATE void intrusive_ptr_add_ref(s_smx_cond_t *cond);
 #endif
index 6c982bc..22a4908 100644 (file)
@@ -70,7 +70,7 @@ void xbt_cond_broadcast(xbt_cond_t cond)
 
 void xbt_cond_destroy(xbt_cond_t cond)
 {
-  SIMIX_cond_destroy((smx_cond_t) cond);
+  SIMIX_cond_unref((smx_cond_t) cond);
 }
 
 /***** barrier related functions *****/