X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/94a6ea22dbd2f12d1015925d3c3fe7a95b38d2e3..ad11907f9221fee26cbe223d667a33744278f46b:/src/simix/smx_synchro.cpp?ds=sidebyside diff --git a/src/simix/smx_synchro.cpp b/src/simix/smx_synchro.cpp index 0d537621ce..c8ec7fe32c 100644 --- a/src/simix/smx_synchro.cpp +++ b/src/simix/smx_synchro.cpp @@ -240,6 +240,7 @@ 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; XBT_OUT(); return cond; } @@ -350,25 +351,41 @@ 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_)++; + 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 **********************************/