strace: Fix issues with a few syscalls
[akaros.git] / tests / pthread_barrier_test.c
1 #include <parlib/stdio.h>
2 #include <pthread.h>
3 #include <stdlib.h>
4 #include <parlib/parlib.h>
5 #include <unistd.h>
6 #include <sys/time.h>
7
8 pthread_barrier_t barrier;
9
10 #define MAX_NR_TEST_THREADS 100000
11 int nr_threads = 100;
12 int nr_loops = 10000;
13 int nr_vcores = 0;
14
15 pthread_t *my_threads;
16 void **my_retvals;
17 bool run_barriertest = FALSE;
18
19 void *thread(void *arg)
20 {       
21         while (!run_barriertest)
22                 cpu_relax();
23         for(int i = 0; i < nr_loops; i++) {
24                 pthread_barrier_wait(&barrier);
25         }
26         return (void*)(long)pthread_self()->id;
27 }
28
29 int main(int argc, char** argv) 
30 {
31         struct timeval start_tv = {0};
32         struct timeval end_tv = {0};
33         long usec_diff;
34         if (argc > 1)
35                 nr_threads = strtol(argv[1], 0, 10);
36         if (argc > 2)
37                 nr_loops = strtol(argv[2], 0, 10);
38         if (argc > 3)
39                 nr_vcores = strtol(argv[3], 0, 10);
40         printf("Running %d threads for %d iterations on %d vcores\n",
41                nr_threads, nr_loops, nr_vcores);
42         nr_threads = MIN(nr_threads, MAX_NR_TEST_THREADS);
43         my_threads = malloc(sizeof(pthread_t) * nr_threads);
44         my_retvals = malloc(sizeof(void*) * nr_threads);
45         if (!(my_retvals && my_threads))
46                 perror("Init threads/malloc");
47         if (nr_vcores) {
48                 /* Only do the vcore trickery if requested */
49                 parlib_never_yield = TRUE;
50                 pthread_mcp_init();                                     /* gives us one vcore */
51                 vcore_request_total(nr_vcores);
52                 parlib_never_vc_request = TRUE;
53                 for (int i = 0; i < nr_vcores; i++) {
54                         printd("Vcore %d mapped to pcore %d\n", i,
55                                    __procinfo.vcoremap[i].pcoreid);
56                 }
57         }
58         pthread_barrier_init(&barrier, NULL, nr_threads);
59         for (int i = 0; i < nr_threads; i++) {
60                 pthread_create(&my_threads[i], NULL, &thread, NULL);
61         }
62         if (gettimeofday(&start_tv, 0))
63                 perror("Start time error...");
64         run_barriertest = TRUE;
65         for (int i = 0; i < nr_threads; i++) {
66                 pthread_join(my_threads[i], &my_retvals[i]);
67         }
68         if (gettimeofday(&end_tv, 0))
69                 perror("End time error...");
70         pthread_barrier_destroy(&barrier);
71         usec_diff = (end_tv.tv_sec - start_tv.tv_sec) * 1000000 +
72                     (end_tv.tv_usec - start_tv.tv_usec);
73         printf("Done: %d threads, %d loops, %d vcores\n",
74                nr_threads, nr_loops, nr_vcores);
75         printf("Time to run: %d usec, %f usec per barrier\n", usec_diff,
76                (float)usec_diff / nr_loops);
77         pthread_barrier_destroy(&barrier);
78