Module: xenomai-forge Branch: master Commit: 08779315c399e85f61c0eaeae9a49ed974eacd4e URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=08779315c399e85f61c0eaeae9a49ed974eacd4e
Author: Philippe Gerum <r...@xenomai.org> Date: Sun Nov 6 18:48:48 2011 +0100 alchemy/testsuite: more task related tests --- lib/alchemy/testsuite/Makefile | 4 +- lib/alchemy/testsuite/task-3.c | 45 ++++++++++++++++ lib/alchemy/testsuite/task-4.c | 106 ++++++++++++++++++++++++++++++++++++++ lib/alchemy/testsuite/task-5.c | 110 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 264 insertions(+), 1 deletions(-) diff --git a/lib/alchemy/testsuite/Makefile b/lib/alchemy/testsuite/Makefile index 5562b49..5ca5280 100644 --- a/lib/alchemy/testsuite/Makefile +++ b/lib/alchemy/testsuite/Makefile @@ -14,7 +14,9 @@ endif TESTS := \ task-1 \ task-2 \ - task-3 + task-3 \ + task-4 \ + task-5 CFLAGS := $(shell DESTDIR=$(DESTDIR) $(XENO_CONFIG) --skin=alchemy --cflags) -g LDFLAGS := $(shell DESTDIR=$(DESTDIR) $(XENO_CONFIG) --skin=alchemy --ldflags) diff --git a/lib/alchemy/testsuite/task-3.c b/lib/alchemy/testsuite/task-3.c new file mode 100644 index 0000000..9432c92 --- /dev/null +++ b/lib/alchemy/testsuite/task-3.c @@ -0,0 +1,45 @@ +#include <stdio.h> +#include <stdlib.h> +#include <copperplate/init.h> +#include <copperplate/traceobj.h> +#include <alchemy/task.h> + +static struct traceobj trobj; + +static RT_TASK t_a, t_b; + +int main(int argc, char *argv[]) +{ + RT_TASK t; + int ret; + + copperplate_init(argc, argv); + + traceobj_init(&trobj, argv[0], 0); + + ret = rt_task_create(&t_a, "taskA", 0, 20, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_create(&t_b, "taskB", 0, 21, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_bind(&t, "taskA", TM_NONBLOCK); + traceobj_assert(&trobj, ret == 0); + traceobj_assert(&trobj, rt_task_same(&t, &t_a)); + + ret = rt_task_bind(&t, "taskB", TM_NONBLOCK); + traceobj_assert(&trobj, ret == 0); + traceobj_assert(&trobj, rt_task_same(&t, &t_b)); + + ret = rt_task_delete(&t_a); + traceobj_assert(&trobj, ret == 0); + ret = rt_task_bind(&t, "taskA", TM_NONBLOCK); + traceobj_assert(&trobj, ret == -EWOULDBLOCK); + + ret = rt_task_delete(&t_b); + traceobj_assert(&trobj, ret == 0); + ret = rt_task_bind(&t, "taskB", TM_NONBLOCK); + traceobj_assert(&trobj, ret == -EWOULDBLOCK); + + exit(0); +} diff --git a/lib/alchemy/testsuite/task-4.c b/lib/alchemy/testsuite/task-4.c new file mode 100644 index 0000000..ca1f163 --- /dev/null +++ b/lib/alchemy/testsuite/task-4.c @@ -0,0 +1,106 @@ +#include <stdio.h> +#include <stdlib.h> +#include <copperplate/init.h> +#include <copperplate/traceobj.h> +#include <alchemy/task.h> +#include <alchemy/sem.h> + +static struct traceobj trobj; + +static int tseq[] = { + 8, 1, 9, 4, 10, 2, 11, 12, 3, 5, 13 +}; + +static RT_TASK t_bgnd, t_fgnd; + +static RT_SEM sem; + +static void background_task(void *arg) +{ + int ret; + + traceobj_enter(&trobj); + + traceobj_mark(&trobj, 1); + + ret = rt_sem_p(&sem, TM_INFINITE); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 2); + + ret = rt_task_suspend(&t_fgnd); + traceobj_assert(&trobj, ret == 0); + + rt_task_sleep(20000000); + + traceobj_mark(&trobj, 3); + + ret = rt_task_resume(&t_fgnd); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 13); + + traceobj_exit(&trobj); +} + +static void foreground_task(void *arg) +{ + int ret; + + traceobj_enter(&trobj); + + traceobj_mark(&trobj, 4); + + ret = rt_sem_p(&sem, TM_INFINITE); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 5); + + traceobj_exit(&trobj); +} + +int main(int argc, char *argv[]) +{ + int ret; + + copperplate_init(argc, argv); + + traceobj_init(&trobj, argv[0], sizeof(tseq) / sizeof(int)); + + ret = rt_sem_create(&sem, "SEMA", 0, S_FIFO); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 8); + + ret = rt_task_create(&t_bgnd, "BGND", 0, 20, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_start(&t_bgnd, background_task, NULL); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 9); + + ret = rt_task_create(&t_fgnd, "FGND", 0, 21, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_start(&t_fgnd, foreground_task, NULL); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 10); + + ret = rt_sem_v(&sem); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 11); + + ret = rt_sem_v(&sem); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 12); + + traceobj_join(&trobj); + + traceobj_verify(&trobj, tseq, sizeof(tseq) / sizeof(int)); + + exit(0); +} diff --git a/lib/alchemy/testsuite/task-5.c b/lib/alchemy/testsuite/task-5.c new file mode 100644 index 0000000..e641695 --- /dev/null +++ b/lib/alchemy/testsuite/task-5.c @@ -0,0 +1,110 @@ +#include <stdio.h> +#include <stdlib.h> +#include <copperplate/init.h> +#include <copperplate/traceobj.h> +#include <alchemy/task.h> +#include <alchemy/sem.h> + +static struct traceobj trobj; + +static int tseq[] = { + 9, 1, 10, 3, 11, 4, 5, 6, 7, 2, 8, 12 +}; + +static RT_TASK t_bgnd, t_fgnd; + +static RT_SEM sem; + +static void background_task(void *arg) +{ + int ret; + + traceobj_enter(&trobj); + + traceobj_mark(&trobj, 1); + + ret = rt_sem_p(&sem, TM_INFINITE); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 2); + + traceobj_exit(&trobj); +} + +static void foreground_task(void *arg) +{ + RT_TASK_INFO info; + int ret; + + traceobj_enter(&trobj); + + traceobj_mark(&trobj, 3); + + ret = rt_sem_p(&sem, TM_INFINITE); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 4); + + ret = rt_sem_v(&sem); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 5); + + ret = rt_task_inquire(NULL, &info); + traceobj_assert(&trobj, ret == 0 && info.prio == 21); + + traceobj_mark(&trobj, 6); + + ret = rt_task_set_priority(&t_bgnd, info.prio); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 7); + + ret = rt_task_set_priority(&t_bgnd, info.prio + 1); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 8); + + traceobj_exit(&trobj); +} + +int main(int argc, char *argv[]) +{ + int ret; + + copperplate_init(argc, argv); + + traceobj_init(&trobj, argv[0], sizeof(tseq) / sizeof(int)); + + ret = rt_sem_create(&sem, "SEMA", 0, S_PRIO); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 9); + + ret = rt_task_create(&t_bgnd, "BGND", 0, 20, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_start(&t_bgnd, background_task, NULL); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 10); + + ret = rt_task_create(&t_fgnd, "FGND", 0, 21, 0); + traceobj_assert(&trobj, ret == 0); + + ret = rt_task_start(&t_fgnd, foreground_task, NULL); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 11); + + ret = rt_sem_v(&sem); + traceobj_assert(&trobj, ret == 0); + + traceobj_mark(&trobj, 12); + + traceobj_join(&trobj); + + traceobj_verify(&trobj, tseq, sizeof(tseq) / sizeof(int)); + + exit(0); +} _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git