From adc819ef7663d01b187998a22794e66f97ef014e Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 17 May 2016 07:36:27 +0200 Subject: sptests/spthreadlife01: Add self delete test case --- testsuites/sptests/spthreadlife01/init.c | 41 +++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 6 deletions(-) (limited to 'testsuites/sptests') diff --git a/testsuites/sptests/spthreadlife01/init.c b/testsuites/sptests/spthreadlife01/init.c index db22859768..6bf2d7f372 100644 --- a/testsuites/sptests/spthreadlife01/init.c +++ b/testsuites/sptests/spthreadlife01/init.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. + * Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -27,6 +27,7 @@ #define PRIO_HIGH 2 #define PRIO_MID 3 #define PRIO_LOW 4 +#define PRIO_VERY_LOW 5 const char rtems_test_name[] = "SPTHREADLIFE 1"; @@ -56,6 +57,10 @@ typedef enum { DELETE_4, DELETE_5, DELETE_6, + DELETE_SELF, + DELETE_7, + DELETE_8, + DELETE_9, INVALID } test_state; @@ -167,15 +172,19 @@ static void delete_extension( rtems_test_assert(executing != deleted); rtems_test_assert(ctx->main_task_id == rtems_task_self()); - assert_priority(PRIO_INIT); - switch (ctx->current) { case DELETE_2: + assert_priority(PRIO_INIT); ctx->current = DELETE_3; break; case DELETE_5: + assert_priority(PRIO_INIT); ctx->current = DELETE_6; break; + case DELETE_8: + assert_priority(PRIO_VERY_LOW); + ctx->current = DELETE_9; + break; default: rtems_test_assert(0); break; @@ -189,20 +198,26 @@ static void terminate_extension(Thread_Control *executing) rtems_test_assert(ctx->worker_task_id == rtems_task_self()); - assert_priority(PRIO_INIT); - switch (ctx->current) { case DELETE_0: + assert_priority(PRIO_INIT); ctx->current = DELETE_1; sc = rtems_task_delete(RTEMS_SELF); rtems_test_assert(sc == RTEMS_SUCCESSFUL); break; case DELETE_1: + assert_priority(PRIO_INIT); ctx->current = DELETE_2; break; case DELETE_4: + assert_priority(PRIO_INIT); ctx->current = DELETE_5; break; + case DELETE_7: + assert_priority(PRIO_LOW); + ctx->current = DELETE_8; + wake_up_main(ctx); + break; default: rtems_test_assert(0); break; @@ -269,6 +284,11 @@ static void worker_task(rtems_task_argument arg) ctx->current = DELETE_4; _Thread_Enable_dispatch(); break; + case DELETE_SELF: + ctx->current = DELETE_7; + rtems_task_delete(RTEMS_SELF); + rtems_test_assert(0); + break; default: rtems_test_assert(0); break; @@ -370,7 +390,14 @@ static void test(void) rtems_test_assert(rtems_resource_snapshot_check(&snapshot)); - rtems_test_assert(ctx->current == DELETE_6); + create_and_start_worker(ctx); + + change_state(ctx, DELETE_6, DELETE_SELF, INVALID); + set_priority(PRIO_VERY_LOW); + + rtems_test_assert(rtems_resource_snapshot_check(&snapshot)); + + rtems_test_assert(ctx->current == DELETE_9); } static void Init(rtems_task_argument arg) @@ -397,6 +424,8 @@ static void Init(rtems_task_argument arg) }, \ RTEMS_TEST_INITIAL_EXTENSION +#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES + #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT -- cgit v1.2.3