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