Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[simix] Refcounting with SIMIX_{process,mutex}_{ref,unref}()
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 16 Jun 2016 07:25:03 +0000 (09:25 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Thu, 16 Jun 2016 07:25:03 +0000 (09:25 +0200)
examples/msg/actions-comm/actions-comm.c
include/simgrid/s4u/actor.hpp
include/simgrid/s4u/mutex.hpp
include/simgrid/simix.h
src/simix/smx_process.cpp
src/simix/smx_synchro.cpp
src/xbt/xbt_os_synchro.c

index 126936b..86486d2 100644 (file)
@@ -183,7 +183,7 @@ static void action_barrier(const char *const *action)
   processes_arrived_sofar--;
   if (processes_arrived_sofar<=0) {
     SIMIX_cond_destroy(cond);
-    SIMIX_mutex_destroy(mutex);
+    SIMIX_mutex_unref(mutex);
     mutex = NULL;
   }
 }
index a07c2bd..24728db 100644 (file)
@@ -164,7 +164,10 @@ public:
   static void killAll();
 
 protected:
-  smx_process_t getInferior() {return pimpl_;}
+  smx_process_t getInferior()
+  {
+    return pimpl_;
+  }
 private:
   smx_process_t pimpl_ = nullptr;
 };
index da7c3df..201f071 100644 (file)
@@ -20,14 +20,14 @@ XBT_PUBLIC_CLASS Mutex {
 public:
   Mutex() :
     mutex_(simcall_mutex_init()) {}
-  Mutex(simgrid::simix::Mutex* mutex) : mutex_(SIMIX_mutex_dup(mutex)) {}
+  Mutex(simgrid::simix::Mutex* mutex) : mutex_(SIMIX_mutex_ref(mutex)) {}
   ~Mutex()
   {
-    SIMIX_mutex_destroy(mutex_);
+    SIMIX_mutex_unref(mutex_);
   }
 
   // Copy+move (with the copy-and-swap idiom):
-  Mutex(Mutex const& mutex) : mutex_(SIMIX_mutex_dup(mutex.mutex_)) {}
+  Mutex(Mutex const& mutex) : mutex_(SIMIX_mutex_ref(mutex.mutex_)) {}
   friend void swap(Mutex& first, Mutex& second)
   {
     using std::swap;
index 065bf3b..e95b78c 100644 (file)
@@ -214,6 +214,8 @@ XBT_PUBLIC(void) SIMIX_host_self_set_data(void *data);
 XBT_PUBLIC(void*) SIMIX_host_self_get_data(void);
 
 /********************************* Process ************************************/
+XBT_PUBLIC(smx_process_t) SIMIX_process_ref(smx_process_t process);
+XBT_PUBLIC(void) SIMIX_process_unref(smx_process_t process);
 XBT_PUBLIC(int) SIMIX_process_count(void);
 XBT_PUBLIC(smx_process_t) SIMIX_process_self(void);
 XBT_PUBLIC(const char*) SIMIX_process_self_get_name(void);
@@ -374,8 +376,8 @@ 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(smx_mutex_t) SIMIX_mutex_ref(smx_mutex_t mutex);
+XBT_PUBLIC(void) SIMIX_mutex_unref(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);
index b47211a..bcd0600 100644 (file)
@@ -28,6 +28,21 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_process, simix, "Logging specific to SIMIX
 
 unsigned long simix_process_maxpid = 0;
 
+/** Increase the refcount for this process */
+smx_process_t SIMIX_process_ref(smx_process_t process)
+{
+  if (process != nullptr)
+    intrusive_ptr_add_ref(process);
+  return process;
+}
+
+/** Decrease the refcount for this process */
+void SIMIX_process_unref(smx_process_t process)
+{
+  if (process != nullptr)
+    intrusive_ptr_release(process);
+}
+
 /**
  * \brief Returns the current agent.
  *
index 5a4d449..0d53762 100644 (file)
@@ -187,17 +187,19 @@ void Mutex::unlock(smx_process_t issuer)
 }
 }
 
-void SIMIX_mutex_destroy(smx_mutex_t mutex)
+/** Increase the refcount for this mutex */
+smx_mutex_t SIMIX_mutex_ref(smx_mutex_t mutex)
 {
   if (mutex != nullptr)
-    intrusive_ptr_release(mutex);
+    intrusive_ptr_add_ref(mutex);
+  return mutex;
 }
 
-XBT_PUBLIC(smx_mutex_t) SIMIX_mutex_dup(smx_mutex_t mutex)
+/** Decrease the refcount for this mutex */
+void SIMIX_mutex_unref(smx_mutex_t mutex)
 {
   if (mutex != nullptr)
-    intrusive_ptr_add_ref(mutex);
-  return mutex;
+    intrusive_ptr_release(mutex);
 }
 
 smx_mutex_t simcall_HANDLER_mutex_init(smx_simcall_t simcall)
index 52b1762..6c982bc 100644 (file)
@@ -39,7 +39,7 @@ void xbt_mutex_release(xbt_mutex_t mutex)
 
 void xbt_mutex_destroy(xbt_mutex_t mutex)
 {
-  SIMIX_mutex_destroy((smx_mutex_t) mutex);
+  SIMIX_mutex_unref((smx_mutex_t) mutex);
 }
 
 /***** condition related functions *****/