fefb3861834f0f237aa6ad6f3e7c3b9d903d8d8c
[model-checker-benchmarks.git] / ms-queue / 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 private_t private;
11 static queue_t *queue;
12
13 static void parse_args(int argc, char **argv)
14 {
15         extern char *optarg;
16         int c;
17
18         while ((c = getopt(argc, argv, "i:p:")) != EOF) {
19                 switch (c) {
20                 case 'i':
21                         iterations = atoi(optarg);
22                         break;
23                 case 'p':
24                         procs = atoi(optarg);
25                         break;
26                 default:
27                         assert(0);
28                 }
29         }
30 }
31
32 static void main_task(void *param)
33 {
34         unsigned i, j;
35         unsigned val;
36         int pid = *((int *)param);
37
38         init_private(pid);
39         for (i = 0; i < iterations; i++) {
40                 val = 1 + pid * iterations + i;
41                 enqueue(queue, val);
42
43                 val = dequeue(queue);
44         }
45 }
46
47 int user_main(int argc, char **argv)
48 {
49         int i, num_threads;
50         thrd_t *t;
51         int *param;
52
53         parse_args(argc, argv);
54         iterations = (iterations + (procs >> 1)) / procs;
55
56         queue = calloc(1, sizeof(*queue));
57         assert(queue);
58
59         num_threads = procs;
60         t = malloc(num_threads * sizeof(thrd_t));
61         param = malloc(num_threads * sizeof(*param));
62
63         init_queue(queue);
64         for (i = 0; i < num_threads; i++) {
65                 param[i] = i;
66                 thrd_create(&t[i], main_task, &param[i]);
67         }
68         for (i = 0; i < num_threads; i++)
69                 thrd_join(t[i]);
70
71         free(param);
72         free(t);
73         free(queue);
74
75         return 0;
76 }