From 391ad3ee4ff868c637a4e1c254da96f194be04e4 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 17 Mar 2014 15:03:22 +0100 Subject: score: Fix thread restart extensions context Run the thread restart extensions in the context of the restarted thread. Run them with thread dispatching enabled. --- testsuites/psxtests/psxcleanup01/init.c | 87 +++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) (limited to 'testsuites/psxtests/psxcleanup01/init.c') diff --git a/testsuites/psxtests/psxcleanup01/init.c b/testsuites/psxtests/psxcleanup01/init.c index 502f90bc6b..d29a891f54 100644 --- a/testsuites/psxtests/psxcleanup01/init.c +++ b/testsuites/psxtests/psxcleanup01/init.c @@ -19,12 +19,89 @@ const char rtems_test_name[] = "PSXCLEANUP 1"; /* forward declarations to avoid warnings */ void *POSIX_Init(void *argument); -void cleaner(void *arg); -void cleaner(void *arg) +static rtems_id main_task_id; + +static rtems_id restart_task_id; + +static volatile rtems_task_argument restart_cleanup_arg; + +static void wake_up_main(void) +{ + rtems_status_code sc; + + sc = rtems_event_transient_send(main_task_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +static void wait_for_restart_task(void) +{ + rtems_status_code sc; + + sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +static void restart_cleanup(void *arg) +{ + rtems_test_assert(restart_task_id == rtems_task_self()); + + restart_cleanup_arg = (rtems_task_argument) arg; + + wake_up_main(); +} + +static void restart_task(rtems_task_argument arg) +{ + pthread_cleanup_push(restart_cleanup, (void *) arg); + + wake_up_main(); + + rtems_test_assert(0); + + pthread_cleanup_pop(0); +} + +static void test_restart_with_cleanup(void) +{ + rtems_status_code sc; + rtems_id id; + rtems_task_priority prio = 1; + + main_task_id = rtems_task_self(); + + sc = rtems_task_set_priority(RTEMS_SELF, prio, &prio); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_create( + rtems_build_name('R', 'E', 'S', 'T'), + 2, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + restart_task_id = id; + + sc = rtems_task_start(id, restart_task, 1); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + wait_for_restart_task(); + + sc = rtems_task_restart(id, 2); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + wait_for_restart_task(); + + rtems_test_assert(restart_cleanup_arg == 1); +} + +static void cleaner(void *arg) { puts( "clean was not supposed to run" ); - rtems_test_exit(0); + rtems_test_assert(0); } void *POSIX_Init( @@ -33,6 +110,8 @@ void *POSIX_Init( { TEST_BEGIN(); + test_restart_with_cleanup(); + puts( "Init - pthread_cleanup_push - a routine we will not execute" ); pthread_cleanup_push(cleaner, NULL); @@ -53,6 +132,8 @@ void *POSIX_Init( #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION +#define CONFIGURE_MAXIMUM_TASKS 1 + #define CONFIGURE_MAXIMUM_POSIX_THREADS 1 #define CONFIGURE_INIT -- cgit v1.2.3