From dbacefe09d961d21ce12a7aa223b1177e9b3c323 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christophe=20Thi=C3=A9ry?= Date: Thu, 21 Apr 2011 16:19:07 +0200 Subject: [PATCH 1/1] Implement reentrant mutexes in xbt_os_thread --- src/include/xbt/xbt_os_thread.h | 8 ++++++ src/xbt/xbt_main.c | 6 ++--- src/xbt/xbt_os_thread.c | 45 +++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/include/xbt/xbt_os_thread.h b/src/include/xbt/xbt_os_thread.h index e4e07fc063..597815d4bd 100644 --- a/src/include/xbt/xbt_os_thread.h +++ b/src/include/xbt/xbt_os_thread.h @@ -64,6 +64,14 @@ XBT_PUBLIC(void) xbt_os_mutex_timedacquire(xbt_os_mutex_t mutex, 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; diff --git a/src/xbt/xbt_main.c b/src/xbt/xbt_main.c index 897ea4373d..a6aafc5626 100644 --- a/src/xbt/xbt_main.c +++ b/src/xbt/xbt_main.c @@ -123,22 +123,22 @@ static void xbt_preinit(void) 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 diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index 2efd81eb2d..781d47113e 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -242,6 +242,12 @@ typedef struct xbt_os_mutex_ { 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 #include @@ -352,6 +358,45 @@ void xbt_os_mutex_destroy(xbt_os_mutex_t mutex) 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 */ -- 2.20.1