8813e37bb44ec93671b505ff00fca1e192018ba6
[model-checker-benchmarks.git] / main.c
1 #include <stdlib.h>
2 #include <assert.h>
3 #include <stdio.h>
4 #include <threads.h>
5
6 #include "my_queue.h"
7
8 static int procs = 2;
9 static int iterations = 1;
10 static queue_t *queue;
11 static thrd_t *threads;
12 static int num_threads;
13
14 int get_thread_num()
15 {
16         thrd_t curr = thrd_current();
17         int i;
18         for (i = 0; i < num_threads; i++)
19                 if (curr.priv == threads[i].priv)
20                         return i;
21         assert(0);
22         return -1;
23 }
24
25 static void parse_args(int argc, char **argv)
26 {
27         extern char *optarg;
28         int c;
29
30         while ((c = getopt(argc, argv, "i:p:")) != EOF) {
31                 switch (c) {
32                 case 'i':
33                         iterations = atoi(optarg);
34                         break;
35                 case 'p':
36                         procs = atoi(optarg);
37                         break;
38                 default:
39                         assert(0);
40                 }
41         }
42 }
43
44 static void main_task(void *param)
45 {
46         unsigned i, j;
47         unsigned val;
48         int pid = *((int *)param);
49
50         for (i = 0; i < iterations; i++) {
51                 val = 1 + pid * iterations + i;
52                 enqueue(queue, val);
53
54                 val = dequeue(queue);
55         }
56 }
57
58 int user_main(int argc, char **argv)
59 {
60         int i;
61         int *param;
62
63         parse_args(argc, argv);
64         iterations = (iterations + (procs >> 1)) / procs;
65
66         queue = calloc(1, sizeof(*queue));
67         assert(queue);
68
69         num_threads = procs;
70         threads = malloc(num_threads * sizeof(thrd_t));
71         param = malloc(num_threads * sizeof(*param));
72
73         init_queue(queue, num_threads);
74         for (i = 0; i < num_threads; i++) {
75                 param[i] = i;
76                 thrd_create(&threads[i], main_task, &param[i]);
77         }
78         for (i = 0; i < num_threads; i++)
79                 thrd_join(threads[i]);
80
81         free(param);
82         free(threads);
83         free(queue);
84
85         return 0;
86 }