Make arsc and local async calls use the same structure.
[akaros.git] / tests / pthread_test.c
1 #include <rstdio.h>
2 #include <pthread.h>
3 #include <stdlib.h>
4 #include <parlib.h>
5 #include <unistd.h>
6 #include <vcore.h>
7
8 pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
9 #define printf_safe(...) {}
10 //#define printf_safe(...) \
11         pthread_mutex_lock(&lock); \
12         printf(__VA_ARGS__); \
13         pthread_mutex_unlock(&lock);
14
15 #define MAX_NR_TEST_THREADS 100000
16 int nr_yield_threads = 100;
17 int nr_yield_loops = 100;
18
19 pthread_t my_threads[MAX_NR_TEST_THREADS];
20 void *my_retvals[MAX_NR_TEST_THREADS];
21
22 __thread int my_id;
23 void *yield_thread(void* arg)
24 {       
25         for (int i = 0; i < nr_yield_loops; i++) {
26                 printf_safe("[A] pthread %d %p on vcore %d, itr: %d\n", pthread_self()->id,
27                        pthread_self(), vcore_id(), i);
28                 pthread_yield();
29                 printf_safe("[A] pthread %p returned from yield on vcore %d, itr: %d\n",
30                             pthread_self(), vcore_id(), i);
31         }
32         return (void*)(pthread_self());
33 }
34
35 void *hello_thread(void* arg)
36 {       
37         printf_safe("[A] pthread %p on vcore %d\n", pthread_self(), vcore_id());
38         return (void*)(pthread_self());
39 }
40
41 int main(int argc, char** argv) 
42 {
43         if (argc > 1)
44                 nr_yield_threads = strtol(argv[1], 0, 10);
45         if (argc > 2)
46                 nr_yield_loops = strtol(argv[2], 0, 10);
47         nr_yield_threads = MIN(nr_yield_threads, MAX_NR_TEST_THREADS);
48         printf("Making %d threads of %d loops each\n", nr_yield_threads, nr_yield_loops);
49         /* create and join on yield */
50         for (int i = 0; i < nr_yield_threads; i++) {
51                 printf_safe("[A] About to create thread %d\n", i);
52                 assert(!pthread_create(&my_threads[i], NULL, &yield_thread, NULL));
53         }
54         for (int i = 0; i < nr_yield_threads; i++) {
55                 printf_safe("[A] About to join on thread %d(%p)\n", i, my_threads[i]);
56                 pthread_join(my_threads[i], &my_retvals[i]);
57                 printf_safe("[A] Successfully joined on thread %d (retval: %p)\n", i,
58                             my_retvals[i]);
59         }
60         printf("Exiting cleanly!\n");
61