From: Gabriel Corona Date: Tue, 14 Jun 2016 11:01:30 +0000 (+0200) Subject: [simix] Add refcount to Mutex X-Git-Tag: v3_14~987^2~6^2~8 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/7aae92e42d677a34e260f2364ba5a33f4d1f6b32 [simix] Add refcount to Mutex --- diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index 4c0fb6c743..065bf3ba6a 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -375,6 +375,7 @@ XBT_PUBLIC(void) simcall_set_category(smx_synchro_t synchro, const char *categor /************************** Synchro simcalls **********************************/ XBT_PUBLIC(smx_mutex_t) simcall_mutex_init(void); XBT_PUBLIC(void) SIMIX_mutex_destroy(smx_mutex_t mutex); +XBT_PUBLIC(smx_mutex_t) SIMIX_mutex_dup(smx_mutex_t mutex); XBT_PUBLIC(void) simcall_mutex_lock(smx_mutex_t mutex); XBT_PUBLIC(int) simcall_mutex_trylock(smx_mutex_t mutex); XBT_PUBLIC(void) simcall_mutex_unlock(smx_mutex_t mutex); diff --git a/src/simix/smx_synchro.cpp b/src/simix/smx_synchro.cpp index e7860fff32..5a4d449efb 100644 --- a/src/simix/smx_synchro.cpp +++ b/src/simix/smx_synchro.cpp @@ -189,7 +189,15 @@ void Mutex::unlock(smx_process_t issuer) void SIMIX_mutex_destroy(smx_mutex_t mutex) { - delete mutex; + if (mutex != nullptr) + intrusive_ptr_release(mutex); +} + +XBT_PUBLIC(smx_mutex_t) SIMIX_mutex_dup(smx_mutex_t mutex) +{ + if (mutex != nullptr) + intrusive_ptr_add_ref(mutex); + return mutex; } smx_mutex_t simcall_HANDLER_mutex_init(smx_simcall_t simcall) diff --git a/src/simix/smx_synchro_private.h b/src/simix/smx_synchro_private.h index 4b45f95ba5..802716a13d 100644 --- a/src/simix/smx_synchro_private.h +++ b/src/simix/smx_synchro_private.h @@ -7,6 +7,8 @@ #ifndef _SIMIX_SYNCHRO_PRIVATE_H #define _SIMIX_SYNCHRO_PRIVATE_H +#include + #include "xbt/base.h" #include "xbt/swag.h" #include "xbt/xbt_os_thread.h" @@ -30,6 +32,22 @@ public: smx_process_t owner = nullptr; // List of sleeping processes: xbt_swag_t sleeping = nullptr; + + // boost::intrusive_ptr support: + friend void intrusive_ptr_add_ref(Mutex* mutex) + { + auto previous = ++mutex->refcount_; + xbt_assert(previous != 0); + (void) previous; + } + friend void intrusive_ptr_release(Mutex* mutex) + { + auto count = mutex->refcount_--; + if (count == 0) + delete mutex; + } +private: + std::atomic_int_fast32_t refcount_ { 1 }; }; }