edits
[cdsspec-compiler.git] / output / mpmc-queue / testcase.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, 2> *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, 2> *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, 2> queue;
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         bin = queue.write_prepare();
49         *bin = 27;
50         printf("init_write_bin %d, val %d\n", bin, 27);
51         queue.write_publish(bin);
52
53
54         printf("Start threads\n");
55
56         thrd_create(&A, (thrd_start_t)&threadA, &queue);
57         thrd_create(&B, (thrd_start_t)&threadB, &queue);
58
59         thrd_join(A);
60         thrd_join(B);
61         printf("Threads complete\n");
62
63         return 0;
64 }
65