Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add functions xbt_os_thread_key_create, xbt_os_thread_get/set_specific
authorChristophe Thiéry <christopho128@gmail.com>
Fri, 22 Apr 2011 14:12:10 +0000 (16:12 +0200)
committerChristophe Thiéry <christopho128@gmail.com>
Fri, 22 Apr 2011 14:12:10 +0000 (16:12 +0200)
src/include/xbt/xbt_os_thread.h
src/xbt/xbt_os_thread.c

index 597815d..22d56bb 100644 (file)
@@ -26,6 +26,8 @@ SG_BEGIN_DECL()
   /** \brief Thread data type (opaque structure) */
 typedef struct xbt_os_thread_ *xbt_os_thread_t;
 
   /** \brief Thread data type (opaque structure) */
 typedef struct xbt_os_thread_ *xbt_os_thread_t;
 
+typedef unsigned int xbt_os_thread_key_t;
+
 /* Calls pthread_atfork() if present, and else does nothing.
  * The only known user of this wrapper is mmalloc_preinit().
  */
 /* Calls pthread_atfork() if present, and else does nothing.
  * The only known user of this wrapper is mmalloc_preinit().
  */
@@ -46,6 +48,9 @@ XBT_PUBLIC(const char *) xbt_os_thread_self_name(void);
 XBT_PUBLIC(const char *) xbt_os_thread_name(xbt_os_thread_t);
 XBT_PUBLIC(void) xbt_os_thread_set_extra_data(void *data);
 XBT_PUBLIC(void *) xbt_os_thread_get_extra_data(void);
 XBT_PUBLIC(const char *) xbt_os_thread_name(xbt_os_thread_t);
 XBT_PUBLIC(void) xbt_os_thread_set_extra_data(void *data);
 XBT_PUBLIC(void *) xbt_os_thread_get_extra_data(void);
+XBT_PUBLIC(void) xbt_os_thread_key_create(xbt_os_thread_key_t* key);
+XBT_PUBLIC(void) xbt_os_thread_set_specific(xbt_os_thread_key_t key, void* value);
+XBT_PUBLIC(void*) xbt_os_thread_get_specific(xbt_os_thread_key_t key);
   /* xbt_os_thread_join frees the joined thread (ie the XBT wrapper around it, the OS frees the rest) */
 XBT_PUBLIC(void) xbt_os_thread_join(xbt_os_thread_t thread,
                                     void **thread_return);
   /* xbt_os_thread_join frees the joined thread (ie the XBT wrapper around it, the OS frees the rest) */
 XBT_PUBLIC(void) xbt_os_thread_join(xbt_os_thread_t thread,
                                     void **thread_return);
index cdafb51..7d58f3e 100644 (file)
@@ -219,6 +219,24 @@ xbt_os_thread_t xbt_os_thread_self(void)
   return res;
 }
 
   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;
 void xbt_os_thread_detach(xbt_os_thread_t thread)
 {
   thread->detached = 1;
@@ -726,6 +744,21 @@ void xbt_os_thread_exit(int *retval)
     ExitThread(0);
 }
 
     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;
 void xbt_os_thread_detach(xbt_os_thread_t thread)
 {
   THROW_UNIMPLEMENTED;