diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-03-17 15:03:22 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-03-31 08:29:43 +0200 |
commit | 391ad3ee4ff868c637a4e1c254da96f194be04e4 (patch) | |
tree | 1016e0ddcc317aa892476ff0e47acb6beb6edd0c /testsuites/psxtests/psxcleanup01/init.c | |
parent | score: Reduce _Thread_Reset() parameters (diff) | |
download | rtems-391ad3ee4ff868c637a4e1c254da96f194be04e4.tar.bz2 |
score: Fix thread restart extensions context
Run the thread restart extensions in the context of the restarted
thread. Run them with thread dispatching enabled.
Diffstat (limited to 'testsuites/psxtests/psxcleanup01/init.c')
-rw-r--r-- | testsuites/psxtests/psxcleanup01/init.c | 87 |
1 files changed, 84 insertions, 3 deletions
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 |