Module: xenomai-3
Branch: next
Commit: 6ff16413e32afd5b0eafda40cff07f09f7af37a7
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=6ff16413e32afd5b0eafda40cff07f09f7af37a7

Author: Philippe Gerum <r...@xenomai.org>
Date:   Thu Oct 30 14:34:15 2014 +0100

pipe-test

---

 lib/alchemy/testsuite/pipe-1.c |  101 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 101 insertions(+)

diff --git a/lib/alchemy/testsuite/pipe-1.c b/lib/alchemy/testsuite/pipe-1.c
new file mode 100644
index 0000000..3b9b183
--- /dev/null
+++ b/lib/alchemy/testsuite/pipe-1.c
@@ -0,0 +1,101 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <copperplate/traceobj.h>
+#include <alchemy/task.h>
+#include <alchemy/pipe.h>
+
+static struct traceobj trobj;
+
+static RT_TASK t_real;
+
+static RT_PIPE pipe;
+
+static pthread_t t_reg;
+
+static int minor;
+
+struct pipe_message {
+       int value;
+};
+
+static void realtime_task(void *arg)
+{
+       struct pipe_message m;
+       int ret, seq;
+
+       traceobj_enter(&trobj);
+
+       ret = rt_pipe_bind(&pipe, "pipe", TM_INFINITE);
+       traceobj_assert(&trobj, ret == 0);
+
+       while (seq < 16) {
+               ret = rt_pipe_read(&pipe, &m, sizeof(m), TM_INFINITE);
+               traceobj_assert(&trobj, ret == sizeof(m));
+               traceobj_assert(&trobj, m.value == seq);
+               ret = rt_pipe_write(&pipe, &m, sizeof(m), P_NORMAL);
+               traceobj_assert(&trobj, ret == sizeof(m));
+               seq = m.value++;
+       }
+
+       pthread_cancel(t_reg);
+
+       traceobj_exit(&trobj);
+}
+
+static void *regular_thread(void *arg)
+{
+       struct pipe_message m;
+       int fd, seq = 0;
+       ssize_t ret;
+       char *rtp;
+
+       asprintf(&rtp, "/dev/rtp%d", minor);
+
+       fd = open(rtp, O_RDWR);
+       free(rtp);
+       traceobj_assert(&trobj, fd >= 0);
+
+       for (;;) {
+               printf("sending message #%d\n", seq);
+               m.value = seq++;
+               ret = write(fd, &m, sizeof(m));
+               traceobj_assert(&trobj, ret == sizeof(m));
+               ret = read(fd, &m, sizeof(m));
+               traceobj_assert(&trobj, ret == sizeof(m));
+               printf("read %d vs %d\n", m.value, seq);
+               traceobj_assert(&trobj, m.value == seq);
+       }
+
+       return NULL;
+}
+
+int main(int argc, char *const argv[])
+{
+       int ret;
+
+       traceobj_init(&trobj, argv[0], 0);
+
+       ret = rt_pipe_create(&pipe, "pipe", P_MINOR_AUTO, 0);
+       traceobj_assert(&trobj, ret >= 0);
+
+       ret = rt_pipe_delete(&pipe);
+       traceobj_assert(&trobj, ret == 0);
+
+       ret = rt_task_create(&t_real, "realtime", 0,  10, 0);
+       traceobj_assert(&trobj, ret == 0);
+
+       ret = rt_task_start(&t_real, realtime_task, NULL);
+       traceobj_assert(&trobj, ret == 0);
+
+       ret = rt_pipe_create(&pipe, "pipe", P_MINOR_AUTO, 16384);
+       traceobj_assert(&trobj, ret >= 0);
+       minor = ret;
+
+       ret = pthread_create(&t_reg, NULL, regular_thread, NULL);
+       traceobj_assert(&trobj, ret == 0);
+
+       traceobj_join(&trobj);
+
+       exit(0);
+}


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to