Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'condvar'
[simgrid.git] / src / simix / smx_synchro.cpp
index 0d53762..2d20719 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_ = 0;
+  intrusive_ptr_add_ref(cond);
   XBT_OUT();
   return cond;
 }
@@ -350,25 +352,40 @@ void SIMIX_cond_broadcast(smx_cond_t cond)
   XBT_OUT();
 }
 
-/**
- * \brief Destroys a condition.
- *
- * Destroys and frees the condition's memory. 
- * \param cond A condition
- */
-void SIMIX_cond_destroy(smx_cond_t cond)
+smx_cond_t SIMIX_cond_ref(smx_cond_t cond)
+{
+  if (cond != nullptr)
+    intrusive_ptr_add_ref(cond);
+  return 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_)++;
+  (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 **********************************/