Add dynamic-tls (dtls) implementation to parlib
[akaros.git] / tests / dtls_test.c
1 #include <stdio.h>
2 #include <pthread.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5
6 /* OS dependent #incs */
7 #include <parlib.h>
8 #include <dtls.h>
9
10 #define NR_TEST_THREADS 10
11 #define NUM_DTLS_KEYS 10
12 pthread_t my_threads[NR_TEST_THREADS];
13 void *my_retvals[NR_TEST_THREADS];
14 dtls_key_t dtls_keys[NUM_DTLS_KEYS];
15 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
16
17 void *thread(void* arg)
18 {       
19   long *dtls_value[NUM_DTLS_KEYS];
20   for(int i=0; i<NUM_DTLS_KEYS; i++) {
21     dtls_value[i] = malloc(sizeof(long));
22     *dtls_value[i] = (long)pthread_self() + i;
23     set_dtls(dtls_keys[i], dtls_value[i]);
24   }
25
26   pthread_mutex_lock(&mutex);
27   long self = (long)pthread_self();
28   printf("In pthread %p (%ld)\n", (void*)self, self);
29   for(int i=0; i<NUM_DTLS_KEYS; i++) {
30     long *value = get_dtls(dtls_keys[i]);
31     printf("  dtls_value[%d] = %ld\n", i, *value);
32   }
33   pthread_mutex_unlock(&mutex);
34
35   return (void*)(self);
36 }
37
38 static void dtls_dtor(void *dtls)
39 {
40   pthread_mutex_lock(&mutex);
41   printf("Phread %p freeing dtls %p.\n", pthread_self(), dtls);
42   free(dtls);
43   pthread_mutex_unlock(&mutex);
44 }
45
46 int main(int argc, char** argv) 
47 {
48   printf("Starting dtls test.\n");
49   for(int i=0; i<NUM_DTLS_KEYS; i++) {
50     dtls_keys[i] = dtls_key_create(dtls_dtor);
51   }
52   for (int i = 0; i < NR_TEST_THREADS; i++) {
53         assert(!pthread_create(&my_threads[i], NULL, &thread, NULL));
54   }
55   for (int i = 0; i < NR_TEST_THREADS; i++) {
56         pthread_join(my_threads[i], &my_retvals[i]);
57   }
58   for(int i=0; i<NUM_DTLS_KEYS; i++) {
59     dtls_key_delete(dtls_keys[i]);
60   }
61   printf("Test complete!\n");
62