fixed commutativity rule
[cdsspec-compiler.git] / benchmark / mpmc-queue / testcase1.cc
1 #include <inttypes.h>
2 #include <threads.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <stdlib.h>
6
7 #include <librace.h>
8
9 #include "mpmc-queue.h"
10
11 void threadA(struct mpmc_boundq_1_alt<int32_t, 1> *queue)
12 {
13         int32_t *bin;
14         bin = queue->write_prepare();
15         if (bin) {
16                 *bin = 1;
17                 printf("write_bin %d, val %d\n", bin, 1);
18                 queue->write_publish(bin);
19         } else {
20                 printf("write failed\n");
21         }
22 }
23
24 void threadB(struct mpmc_boundq_1_alt<int32_t, 1> *queue)
25 {
26         int32_t *bin;
27         bin = queue->read_fetch();
28         if (bin) {
29                 printf("read_bin: %d, val %d\n", bin, *bin);
30                 queue->read_consume(bin);
31         } else {
32                 printf("Read failed\n");
33         }
34 }
35
36 int user_main(int argc, char **argv)
37 {
38         struct mpmc_boundq_1_alt<int32_t, 1> queue(0xFFFF);
39         thrd_t A, B;
40
41         printf("Adding initial element\n");
42         int32_t *bin;
43         bin = queue.write_prepare();
44         *bin = 17;
45         printf("init_write_bin %d, val %d\n", bin, 17);
46         queue.write_publish(bin);
47
48 /*
49         bin = queue.write_prepare();
50         *bin = 27;
51         printf("init_write_bin %d, val %d\n", bin, 27);
52         queue.write_publish(bin);
53 */
54
55         printf("Start threads\n");
56
57         thrd_create(&A, (thrd_start_t)&threadA, &queue);
58         thrd_create(&B, (thrd_start_t)&threadB, &queue);
59
60         thrd_join(A);
61         thrd_join(B);
62         printf("Threads complete\n");
63
64         return 0;
65 }