processes_arrived_sofar--;
if (processes_arrived_sofar<=0) {
SIMIX_cond_destroy(cond);
- SIMIX_mutex_destroy(mutex);
+ SIMIX_mutex_unref(mutex);
mutex = NULL;
}
}
static void killAll();
protected:
- smx_process_t getInferior() {return pimpl_;}
+ smx_process_t getInferior()
+ {
+ return pimpl_;
+ }
private:
smx_process_t pimpl_ = nullptr;
};
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;
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);
/************************** 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);
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.
*
}
}
-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)
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 *****/