Psuh dtls stuff into pthread_get/set specific
authorKevin Klues <klueska@cs.berkeley.edu>
Sat, 15 Dec 2012 00:53:02 +0000 (16:53 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Sat, 15 Dec 2012 00:53:02 +0000 (16:53 -0800)
tests/dtls_test.c
user/pthread/pthread.c
user/pthread/pthread.h

index dbb7371..2130968 100644 (file)
@@ -5,29 +5,28 @@
 
 /* OS dependent #incs */
 #include <parlib.h>
-#include <dtls.h>
 
 #define NR_TEST_THREADS 10
-#define NUM_DTLS_KEYS 10
+#define NUM_PTHREAD_KEYS 10
 pthread_t my_threads[NR_TEST_THREADS];
 void *my_retvals[NR_TEST_THREADS];
-dtls_key_t dtls_keys[NUM_DTLS_KEYS];
+pthread_key_t pthread_keys[NUM_PTHREAD_KEYS];
 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 
 void *thread(void* arg)
 {      
-  long *dtls_value[NUM_DTLS_KEYS];
-  for(int i=0; i<NUM_DTLS_KEYS; i++) {
+  long *dtls_value[NUM_PTHREAD_KEYS];
+  for(int i=0; i<NUM_PTHREAD_KEYS; i++) {
     dtls_value[i] = malloc(sizeof(long));
     *dtls_value[i] = (long)pthread_self() + i;
-    set_dtls(dtls_keys[i], dtls_value[i]);
+    pthread_setspecific(pthread_keys[i], dtls_value[i]);
   }
 
   pthread_mutex_lock(&mutex);
   long self = (long)pthread_self();
   printf("In pthread %p (%ld)\n", (void*)self, self);
-  for(int i=0; i<NUM_DTLS_KEYS; i++) {
-    long *value = get_dtls(dtls_keys[i]);
+  for(int i=0; i<NUM_PTHREAD_KEYS; i++) {
+    long *value = pthread_getspecific(pthread_keys[i]);
     printf("  dtls_value[%d] = %ld\n", i, *value);
   }
   pthread_mutex_unlock(&mutex);
@@ -46,8 +45,8 @@ static void dtls_dtor(void *dtls)
 int main(int argc, char** argv) 
 {
   printf("Starting dtls test.\n");
-  for(int i=0; i<NUM_DTLS_KEYS; i++) {
-    dtls_keys[i] = dtls_key_create(dtls_dtor);
+  for(int i=0; i<NUM_PTHREAD_KEYS; i++) {
+    pthread_key_create(&pthread_keys[i], dtls_dtor);
   }
   for (int i = 0; i < NR_TEST_THREADS; i++) {
        assert(!pthread_create(&my_threads[i], NULL, &thread, NULL));
@@ -55,8 +54,8 @@ int main(int argc, char** argv)
   for (int i = 0; i < NR_TEST_THREADS; i++) {
        pthread_join(my_threads[i], &my_retvals[i]);
   }
-  for(int i=0; i<NUM_DTLS_KEYS; i++) {
-    dtls_key_delete(dtls_keys[i]);
+  for(int i=0; i<NUM_PTHREAD_KEYS; i++) {
+    pthread_key_delete(pthread_keys[i]);
   }
   printf("Test complete!\n");
 } 
index af8a527..a488727 100644 (file)
@@ -541,6 +541,7 @@ void pthread_exit(void *ret)
 {
        struct pthread_tcb *pthread = pthread_self();
        pthread->retval = ret;
+       destroy_dtls();
        uthread_yield(FALSE, __pth_exit_cb, 0);
 }
 
@@ -809,3 +810,27 @@ int pthread_sigqueue(pthread_t *thread, int sig, const union sigval value)
        return -1;
 }
 
+int pthread_key_create(pthread_key_t *key, void (*destructor)(void*))
+{
+       *key = dtls_key_create(destructor);
+       assert(key);
+       return 0;
+}
+
+int pthread_key_delete(pthread_key_t key)
+{
+       dtls_key_delete(key);
+       return 0;
+}
+
+void *pthread_getspecific(pthread_key_t key)
+{
+       return get_dtls(key);
+}
+
+int pthread_setspecific(pthread_key_t key, const void *value)
+{
+       set_dtls(key, (void*)value);
+       return 0;
+}
+
index e355fb6..bfdd216 100644 (file)
@@ -6,6 +6,7 @@
 #include <vcore.h>
 #include <uthread.h>
 #include <mcs.h>
+#include <dtls.h>
 
 #ifdef __cplusplus
   extern "C" {
@@ -122,7 +123,7 @@ typedef struct
 } pthread_attr_t;
 typedef int pthread_barrierattr_t;
 typedef int pthread_once_t;
-typedef void** pthread_key_t;
+typedef dtls_key_t pthread_key_t;
 
 /* Akaros pthread extensions / hacks */
 void pthread_can_vcore_request(bool can);      /* default is TRUE */
@@ -189,14 +190,10 @@ int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset);
 int pthread_sigqueue(pthread_t *thread, int sig, const union sigval value);
 
 // Dynamic TLS stuff
-static inline int pthread_key_create(pthread_key_t *key, void (*destructor)(void*))
-{ return -1; }
-static inline int pthread_key_delete(pthread_key_t key)
-{ return -1; }
-static inline void *pthread_getspecific(pthread_key_t key)
-{ return NULL; }
-static inline int pthread_setspecific(pthread_key_t key, const void *value)
-{ return -1; }
+int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
+int pthread_key_delete(pthread_key_t key);
+void *pthread_getspecific(pthread_key_t key);
+int pthread_setspecific(pthread_key_t key, const void *value);
 
 #ifdef __cplusplus
   }