Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add functions xbt_os_thread_key_create, xbt_os_thread_get/set_specific
[simgrid.git] / src / xbt / xbt_os_thread.c
index c79377a..7d58f3e 100644 (file)
@@ -219,6 +219,24 @@ xbt_os_thread_t xbt_os_thread_self(void)
   return res;
 }
 
+void xbt_os_thread_key_create(xbt_os_thread_key_t* key) {
+
+  int errcode;
+  if ((errcode = pthread_key_create(key, NULL)))
+    THROWF(system_error, errcode, "pthread_key_create failed");
+}
+
+void xbt_os_thread_set_specific(xbt_os_thread_key_t key, void* value) {
+
+  int errcode;
+  if ((errcode = pthread_setspecific(key, value)))
+    THROWF(system_error, errcode, "pthread_setspecific failed");
+}
+
+void* xbt_os_thread_get_specific(xbt_os_thread_key_t key) {
+  return pthread_getspecific(key);
+}
+
 void xbt_os_thread_detach(xbt_os_thread_t thread)
 {
   thread->detached = 1;
@@ -242,12 +260,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>
 
@@ -732,6 +744,21 @@ void xbt_os_thread_exit(int *retval)
     ExitThread(0);
 }
 
+void xbt_os_thread_key_create(xbt_os_thread_key_t* key) {
+
+  *key = TlsAlloc();
+}
+
+void xbt_os_thread_set_specific(xbt_os_thread_key_t key, void* value) {
+
+  if (!TlsSetValue(key, value))
+    THROWF(system_error, (int) GetLastError(), "TlsSetValue() failed");
+}
+
+void* xbt_os_thread_get_specific(xbt_os_thread_key_t key) {
+  return TlsGetValue(key);
+}
+
 void xbt_os_thread_detach(xbt_os_thread_t thread)
 {
   THROW_UNIMPLEMENTED;
@@ -1134,6 +1161,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;
@@ -1156,7 +1190,12 @@ xbt_os_rmutex_t xbt_os_rmutex_init(void)
 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 == NULL) {
+    /* the thread module is not initialized yet */
+    rmutex->owner = NULL;
+    return;
+  }
 
   if (self != rmutex->owner) {
     xbt_os_mutex_acquire(rmutex->mutex);
@@ -1169,6 +1208,11 @@ void xbt_os_rmutex_acquire(xbt_os_rmutex_t rmutex)
 
 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) {