--- /dev/null
+#include <inttypes.h>
+#include <threads.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <librace.h>
+
+#include "mpmc-queue.h"
+
+void threadA(struct mpmc_boundq_1_alt<int32_t, 1> *queue)
+{
+ int32_t *bin;
+ /*
+ bin = queue->write_prepare();
+ if (bin) {
+ *bin = 1;
+ printf("write_bin %d, val %d\n", bin, 1);
+ queue->write_publish(bin);
+ } else {
+ printf("write failed\n");
+ }
+ */
+
+ for (int i = 0; i < 1; i++) {
+ bin = queue->write_prepare();
+ if (bin) {
+ *bin = 1;
+ queue->write_publish(bin);
+ printf("write_bin %d, val %d\n", bin, 1);
+ } else {
+ printf("write failed\n");
+ }
+
+ bin = queue->read_fetch();
+ if (bin) {
+ printf("read_bin: %d, val %d\n", bin, *bin);
+ queue->read_consume(bin);
+ } else {
+ printf("read failed\n");
+ }
+ }
+
+}
+
+void threadB(struct mpmc_boundq_1_alt<int32_t, 1> *queue)
+{
+ int32_t *bin;
+ for (int i = 0; i < 1; i++) {
+ bin = queue->read_fetch();
+ if (bin) {
+ printf("read_bin: %d, val %d\n", bin, *bin);
+ queue->read_consume(bin);
+ } else {
+ printf("read failed\n");
+ }
+ }
+
+
+}
+
+int user_main(int argc, char **argv)
+{
+ struct mpmc_boundq_1_alt<int32_t, 1> queue;
+ thrd_t A, A1, B;
+
+ printf("Adding initial element\n");
+ int32_t *bin;
+ for (int i = 0; i < 1; i++) {
+ printf("#%d, \n", i);
+ bin = queue.write_prepare();
+ *bin = 17;
+ printf("init_write_bin %d, val %d\n", bin, 17);
+ queue.write_publish(bin);
+
+ bin = queue.read_fetch();
+ if (bin) {
+ printf("init_read: %d, val %d\n", bin, *bin);
+ queue.read_consume(bin);
+ }
+ }
+
+ for (int i = 0; i < 3; i++) {
+
+ }
+
+ printf("Start threads\n");
+
+ thrd_create(&A, (thrd_start_t)&threadA, &queue);
+ thrd_create(&A1, (thrd_start_t)&threadA, &queue);
+ thrd_create(&B, (thrd_start_t)&threadB, &queue);
+
+ thrd_join(A);
+ thrd_join(A1);
+ thrd_join(B);
+ printf("Threads complete\n");
+
+ return 0;
+}