Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Attempt to allow initializing log categories before threads are
[simgrid.git] / src / xbt / xbt_os_thread.c
index 781d471..cdafb51 100644 (file)
@@ -242,12 +242,6 @@ 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 <time.h>
 #include <math.h>
 
@@ -358,45 +352,6 @@ 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 */
@@ -1173,6 +1128,13 @@ void xbt_os_sem_get_value(xbt_os_sem_t sem, int *svalue)
 
 #endif
 
+/***** reentrant mutexes *****/
+typedef struct xbt_os_rmutex_ {
+  xbt_os_mutex_t mutex;
+  xbt_os_thread_t owner;
+  int count;
+} s_xbt_os_rmutex_t;
+
 void xbt_os_thread_set_extra_data(void *data)
 {
   xbt_os_thread_self()->extra_data = data;
@@ -1182,3 +1144,52 @@ void *xbt_os_thread_get_extra_data(void)
 {
   return xbt_os_thread_self()->extra_data;
 }
+
+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();
+
+  if (self == NULL) {
+    /* the thread module is not initialized yet */
+    rmutex->owner = NULL;
+    return;
+  }
+
+  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)
+{
+  if (rmutex->owner == NULL) {
+    /* the thread module was not initialized */
+    return;
+  }
+
+  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);
+}