XBT_PUBLIC(void) xbt_os_mutex_release(xbt_os_mutex_t mutex);
XBT_PUBLIC(void) xbt_os_mutex_destroy(xbt_os_mutex_t mutex);
+/** \brief Thread reentrant mutex data type (opaque structure) */
+typedef struct xbt_os_rmutex_ *xbt_os_rmutex_t;
+
+XBT_PUBLIC(xbt_os_rmutex_t) xbt_os_rmutex_init(void);
+XBT_PUBLIC(void) xbt_os_rmutex_acquire(xbt_os_rmutex_t rmutex);
+XBT_PUBLIC(void) xbt_os_rmutex_release(xbt_os_rmutex_t rmutex);
+XBT_PUBLIC(void) xbt_os_rmutex_destroy(xbt_os_rmutex_t rmutex);
+
/** \brief Thread condition data type (opaque structure) */
typedef struct xbt_os_cond_ *xbt_os_cond_t;
XBT_LOG_CONNECT(xbt_parmap,xbt);
XBT_LOG_CONNECT(xbt_parmap_unit,xbt_parmap);
- xbt_fifo_preinit();
- xbt_dict_preinit();
xbt_backtrace_preinit();
xbt_os_thread_mod_preinit();
+ xbt_fifo_preinit();
+ xbt_dict_preinit();
}
static void xbt_postexit(void)
{
- xbt_os_thread_mod_postexit();
xbt_backtrace_postexit();
xbt_fifo_postexit();
xbt_dict_postexit();
xbt_log_postexit();
+ xbt_os_thread_mod_postexit();
free(xbt_binary_name);
#ifdef HAVE_MMAP
pthread_mutex_t m;
} s_xbt_os_mutex_t;
+typedef struct xbt_os_rmutex_ {
+ xbt_os_mutex_t mutex;
+ xbt_os_thread_t owner;
+ int count;
+} s_xbt_os_rmutex_t;
+
#include <time.h>
#include <math.h>
free(mutex);
}
+xbt_os_rmutex_t xbt_os_rmutex_init(void)
+{
+ xbt_os_rmutex_t rmutex = xbt_new0(struct xbt_os_rmutex_, 0);
+ rmutex->mutex = xbt_os_mutex_init();
+ rmutex->owner = NULL;
+ rmutex->count = 0;
+ return rmutex;
+}
+
+void xbt_os_rmutex_acquire(xbt_os_rmutex_t rmutex)
+{
+ xbt_os_thread_t self = xbt_os_thread_self();
+ xbt_assert(self != NULL, "Cannot get my own thread object (is the thread module initialized?)");
+
+ if (self != rmutex->owner) {
+ xbt_os_mutex_acquire(rmutex->mutex);
+ rmutex->owner = self;
+ rmutex->count = 1;
+ } else {
+ rmutex->count++;
+ }
+}
+
+void xbt_os_rmutex_release(xbt_os_rmutex_t rmutex)
+{
+ xbt_assert(rmutex->owner == xbt_os_thread_self());
+
+ if (--rmutex->count == 0) {
+ rmutex->owner = NULL;
+ xbt_os_mutex_release(rmutex->mutex);
+ }
+}
+
+void xbt_os_rmutex_destroy(xbt_os_rmutex_t rmutex)
+{
+ xbt_os_mutex_destroy(rmutex->mutex);
+ xbt_free(rmutex);
+}
+
/***** condition related functions *****/
typedef struct xbt_os_cond_ {
/* KEEP IT IN SYNC WITH xbt_thread.c */