Add data structure benchmarks
[c11concurrency-benchmarks.git] / cdschecker_modified_benchmarks / ms-queue / main.cc
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <threads.h>
4 //#include "cds_threads.h"
5
6 #include "my_queue.h"
7 #include "model-assert.h"
8
9 #define user_main main
10
11 static int procs = 4;
12 static queue_t *queue;
13 static thrd_t *threads;
14 static unsigned int *input;
15 static unsigned int *output;
16 static int num_threads;
17
18 int get_thread_num()
19 {
20         thrd_t curr = thrd_current();
21         int i;
22         for (i = 0; i < num_threads; i++)
23                 if (curr.priv == threads[i].priv)
24                         return i;
25         MODEL_ASSERT(0);
26         return -1;
27 }
28
29 bool succ1, succ2;
30
31 static void main_task(void *param)
32 {
33         int pid = *((int *)param);
34         if (!pid) {
35                 input[0] = 17;
36                 enqueue(queue, input[0]);
37                 succ1 = dequeue(queue, &output[0]);
38                 //printf("Dequeue: %d\n", output[0]);
39         } else {
40                 input[1] = 37;
41                 enqueue(queue, input[1]);
42                 succ2 = dequeue(queue, &output[1]);
43         }
44 }
45
46 int user_main(int argc, char **argv)
47 {
48         int i;
49         int *param;
50         unsigned int in_sum = 0, out_sum = 0;
51
52         queue = (queue_t *)calloc(1, sizeof(*queue));
53         MODEL_ASSERT(queue);
54
55         num_threads = procs;
56         threads = (thrd_t *)malloc(num_threads * sizeof(thrd_t));
57         param = (int *)malloc(num_threads * sizeof(*param));
58         input = (unsigned *)calloc(num_threads, sizeof(*input));
59         output = (unsigned *)calloc(num_threads, sizeof(*output));
60
61         init_queue(queue, num_threads);
62         for (i = 0; i < num_threads; i++) {
63                 param[i] = i;
64                 thrd_create(&threads[i], main_task, &param[i]);
65         }
66         for (i = 0; i < num_threads; i++)
67                 thrd_join(threads[i]);
68
69         for (i = 0; i < num_threads; i++) {
70                 in_sum += input[i];
71                 out_sum += output[i];
72         }
73         for (i = 0; i < num_threads; i++)
74                 printf("input[%d] = %u\n", i, input[i]);
75         for (i = 0; i < num_threads; i++)
76                 printf("output[%d] = %u\n", i, output[i]);
77 /*
78         if (succ1 && succ2)
79                 MODEL_ASSERT(in_sum == out_sum);
80         else
81                 MODEL_ASSERT(false);
82 */
83         free(param);
84         free(threads);
85         free(queue);
86
87         return 0;
88 }