Module: xenomai-3 Branch: next Commit: fc7a90768c60e59cdc86ed47a42d4757ff2c4d90 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=fc7a90768c60e59cdc86ed47a42d4757ff2c4d90
Author: Philippe Gerum <r...@xenomai.org> Date: Thu Apr 30 10:26:46 2015 +0200 alchemy/testsuite: add multi-heap test --- lib/alchemy/testsuite/Makefile | 1 + lib/alchemy/testsuite/heap-2.c | 98 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile index e3804a0..a831c99 100644 --- a/lib/alchemy/testsuite/Makefile +++ b/lib/alchemy/testsuite/Makefile @@ -36,6 +36,7 @@ TESTS := \ mutex-1 \ event-1 \ heap-1 \ + heap-2 \ buffer-1 \ $(core-specific) diff --git a/lib/alchemy/testsuite/heap-2.c b/lib/alchemy/testsuite/heap-2.c new file mode 100644 index 0000000..9a4ed42 --- /dev/null +++ b/lib/alchemy/testsuite/heap-2.c @@ -0,0 +1,98 @@ +#include <stdio.h> +#include <stdlib.h> +#include <copperplate/traceobj.h> +#include <alchemy/task.h> +#include <alchemy/heap.h> +#include <alchemy/queue.h> + +#define HEAPSIZE 16384 +#define MSGSIZE 16 +#define NMESSAGES (HEAPSIZE / MSGSIZE) +#define POOLSIZE (NMESSAGES * sizeof(void *)) + +static struct traceobj trobj; + +static RT_TASK t_pull, t_push; + +static RT_HEAP heap1, heap2; + +static RT_QUEUE queue1, queue2; + +static void pull_task(void *arg) +{ + int ret, n = 0; + void *p; + + traceobj_enter(&trobj); + + while (n++ < 1000) { + ret = rt_heap_alloc(&heap1, MSGSIZE, TM_INFINITE, &p); + traceobj_assert(&trobj, ret == 0); + ret = rt_queue_write(&queue1, &p, sizeof(p), Q_NORMAL); + traceobj_assert(&trobj, ret >= 0); + + ret = rt_queue_read(&queue2, &p, sizeof(p), TM_INFINITE); + traceobj_assert(&trobj, ret == sizeof(p)); + ret = rt_heap_free(&heap2, p); + traceobj_assert(&trobj, ret == 0); + } + + traceobj_exit(&trobj); +} + +static void push_task(void *arg) +{ + int ret, n = 0; + void *p; + + traceobj_enter(&trobj); + + while (n++ < 1000) { + ret = rt_queue_read(&queue1, &p, sizeof(p), TM_INFINITE); + traceobj_assert(&trobj, ret == sizeof(p)); + ret = rt_heap_free(&heap1, p); + traceobj_assert(&trobj, ret == 0); + + ret = rt_heap_alloc(&heap2, MSGSIZE, TM_INFINITE, &p); + traceobj_assert(&trobj, ret == 0); + ret = rt_queue_write(&queue2, &p, sizeof(p), Q_NORMAL); + traceobj_assert(&trobj, ret >= 0); + } + + traceobj_exit(&trobj); +} + +int main(int argc, char *const argv[]) +{ + int ret; + + traceobj_init(&trobj, argv[0], 0); + + ret = rt_heap_create(&heap1, "HEAP1", HEAPSIZE, H_FIFO); + traceobj_assert(&trobj, ret == 0); + + ret = rt_heap_create(&heap2, "HEAP2", HEAPSIZE, H_FIFO); + traceobj_assert(&trobj, ret == 0); + + ret = rt_queue_create(&queue1, "QUEUE1", POOLSIZE, NMESSAGES, Q_FIFO); + traceobj_assert(&trobj, ret == 0); + + ret = rt_queue_create(&queue2, "QUEUE2", POOLSIZE, NMESSAGES, Q_FIFO); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_create(&t_pull, "PULL", 0, 20, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_create(&t_push, "PUSH", 0, 20, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_start(&t_pull, pull_task, NULL); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_start(&t_push, push_task, 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