From 7d5c27e308632cce2052eb2aaf6a601aa0b5bc17 Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Thu, 27 Mar 2014 14:23:20 +0100 Subject: privateenv: Remove sharing of user environment between threads. --- cpukit/include/rtems/userenv.h | 20 --------- cpukit/libcsupport/src/privateenv.c | 60 ++------------------------ testsuites/fstests/fsnofs01/fsnofs01.doc | 1 - testsuites/fstests/fsnofs01/init.c | 12 ------ testsuites/sptests/spprivenv01/init.c | 40 +++++++---------- testsuites/sptests/spprivenv01/spprivenv01.doc | 5 +-- testsuites/sptests/spprivenv01/spprivenv01.scn | 15 +++---- 7 files changed, 27 insertions(+), 126 deletions(-) diff --git a/cpukit/include/rtems/userenv.h b/cpukit/include/rtems/userenv.h index 7d874d380f..8a9a4fcd32 100644 --- a/cpukit/include/rtems/userenv.h +++ b/cpukit/include/rtems/userenv.h @@ -64,9 +64,6 @@ typedef struct { gid_t egid; char login_buffer[LOGIN_NAME_MAX]; pid_t pgrp; /* process group id */ - /* User environment maintenance */ - rtems_id task_id; - int reference_count; } rtems_user_env_t; extern rtems_user_env_t * rtems_current_user_env; @@ -96,23 +93,6 @@ extern rtems_user_env_t rtems_global_user_env; */ rtems_status_code rtems_libio_set_private_env(void); -/** - * @brief Creates a private environment shared with another task. - * - * An attempt to share the environment with itself has no effect. This - * function must be called from normal thread context and may block on a mutex. - * Thread dispatching is disabled to protect some critical sections. - * - * @param[in] task_id The private environment is shared with the task specified - * by this identifier. - * - * @retval RTEMS_SUCCESSFUL Successful operation. - * @retval RTEMS_UNSATISFIED No shared environment is available for this task - * @retval RTEMS_TOO_MANY Cannot register the shared environment. - * identifier. - */ -rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ; - /** * @brief Use the global environment. * diff --git a/cpukit/libcsupport/src/privateenv.c b/cpukit/libcsupport/src/privateenv.c index c7a65a57e8..bee94c117f 100644 --- a/cpukit/libcsupport/src/privateenv.c +++ b/cpukit/libcsupport/src/privateenv.c @@ -35,13 +35,9 @@ static void free_user_env(void *arg) bool uses_global_env = env == &rtems_global_user_env; if (!uses_global_env) { - if (env->reference_count == 1) { - rtems_filesystem_global_location_release(env->current_directory); - rtems_filesystem_global_location_release(env->root_directory); - free(env); - } else { - --env->reference_count; - } + rtems_filesystem_global_location_release(env->current_directory); + rtems_filesystem_global_location_release(env->root_directory); + free(env); } } @@ -55,18 +51,14 @@ static void free_user_env_protected(rtems_user_env_t *env) rtems_status_code rtems_libio_set_private_env(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; - rtems_id self_task_id = rtems_task_self(); rtems_user_env_t *old_env = rtems_current_user_env; bool uses_global_env = old_env == &rtems_global_user_env; - bool uses_shared_env = old_env->task_id != self_task_id; - if (uses_global_env || uses_shared_env) { + if (uses_global_env) { rtems_user_env_t *new_env = calloc(1, sizeof(*new_env)); if (new_env != NULL) { *new_env = *old_env; - new_env->reference_count = 1; - new_env->task_id = self_task_id; new_env->root_directory = rtems_filesystem_global_location_obtain(&old_env->root_directory); new_env->current_directory = @@ -102,50 +94,6 @@ rtems_status_code rtems_libio_set_private_env(void) return sc; } -rtems_status_code rtems_libio_share_private_env(rtems_id task_id) -{ - rtems_status_code sc = RTEMS_SUCCESSFUL; - rtems_id self_task_id = rtems_task_self(); - - if (task_id != RTEMS_SELF && self_task_id != task_id) { - rtems_user_env_t *env; - - /* - * We have to disable the thread dispatching to prevent deletion of the - * environment in the meantime. - */ - _Thread_Disable_dispatch(); - sc = rtems_task_variable_get( - task_id, - (void *) &rtems_current_user_env, - (void *) &env - ); - if (sc == RTEMS_SUCCESSFUL) { - ++env->reference_count; - } else { - sc = RTEMS_UNSATISFIED; - } - _Thread_Enable_dispatch(); - - if (sc == RTEMS_SUCCESSFUL) { - sc = rtems_task_variable_add( - RTEMS_SELF, - (void **) &rtems_current_user_env, - free_user_env - ); - if (sc == RTEMS_SUCCESSFUL) { - free_user_env_protected(rtems_current_user_env); - rtems_current_user_env = env; - } else { - free_user_env_protected(env); - sc = RTEMS_TOO_MANY; - } - } - } - - return sc; -} - void rtems_libio_use_global_env(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; diff --git a/testsuites/fstests/fsnofs01/fsnofs01.doc b/testsuites/fstests/fsnofs01/fsnofs01.doc index 5980be8844..3a47c46a22 100644 --- a/testsuites/fstests/fsnofs01/fsnofs01.doc +++ b/testsuites/fstests/fsnofs01/fsnofs01.doc @@ -35,7 +35,6 @@ directives: + rtems_filesystem_location_free + rtems_filesystem_global_location_obtain_null + rtems_libio_set_private_env - + rtems_libio_share_private_env + rtems_libio_use_global_env + rmdir + stat diff --git a/testsuites/fstests/fsnofs01/init.c b/testsuites/fstests/fsnofs01/init.c index fdcf959fdf..13cd7096e7 100644 --- a/testsuites/fstests/fsnofs01/init.c +++ b/testsuites/fstests/fsnofs01/init.c @@ -315,18 +315,6 @@ static void test_user_env(void) rtems_test_assert(node_count(loc_chain) == 1); rtems_test_assert(null_loc->reference_count == 4); - sc = rtems_libio_share_private_env(RTEMS_SELF); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); - - rtems_test_assert(node_count(loc_chain) == 1); - rtems_test_assert(null_loc->reference_count == 4); - - sc = rtems_libio_share_private_env(rtems_task_self()); - rtems_test_assert(sc == RTEMS_SUCCESSFUL); - - rtems_test_assert(node_count(loc_chain) == 1); - rtems_test_assert(null_loc->reference_count == 4); - rtems_libio_use_global_env(); rtems_test_assert(node_count(loc_chain) == 1); diff --git a/testsuites/sptests/spprivenv01/init.c b/testsuites/sptests/spprivenv01/init.c index f60bcef816..a670085f80 100644 --- a/testsuites/sptests/spprivenv01/init.c +++ b/testsuites/sptests/spprivenv01/init.c @@ -31,6 +31,9 @@ rtems_task task_routine(rtems_task_argument not_used) sc = rtems_libio_set_private_env(); directive_failed( sc, "set private env" ); + rtems_test_assert( sc == RTEMS_SUCCESSFUL ); + rtems_test_assert( rtems_current_user_env != &rtems_global_user_env ); + sleep( 1 ); rtems_task_delete( RTEMS_SELF ); @@ -42,9 +45,9 @@ rtems_task Init( { rtems_status_code sc; void *opaque; - rtems_id current_task_id; rtems_id task_id; rtems_name another_task_name; + rtems_user_env_t *current_env; TEST_BEGIN(); @@ -68,6 +71,12 @@ rtems_task Init( puts( "Init - freeing the workspace memory" ); rtems_workspace_greedy_free( opaque ); + puts( "Init - Attempt to get a private environment" ); + sc = rtems_libio_set_private_env(); + rtems_test_assert( sc == RTEMS_SUCCESSFUL ); + current_env = rtems_current_user_env; + rtems_test_assert( current_env != &rtems_global_user_env ); + puts( "Init - creating a task name and a task -- OK" ); another_task_name = @@ -85,33 +94,14 @@ rtems_task Init( sc = rtems_task_start( task_id, task_routine, 0); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); - puts( "Init - attempt to share the env with another task -- Expect error" ); - sc = rtems_libio_share_private_env( task_id ); - rtems_test_assert( sc == RTEMS_UNSATISFIED ); - sleep( 1 ); - puts( "Init - attempt to share the env with another task -- OK" ); - sc = rtems_libio_share_private_env( task_id ); - rtems_test_assert( sc == RTEMS_SUCCESSFUL ); - rtems_test_assert( rtems_current_user_env->task_id == task_id ); - - puts( "Init - Get current task id" ); - current_task_id = rtems_task_self(); + puts( "Init - Check current private environment. Should be same as before." ); + rtems_test_assert( rtems_current_user_env == current_env ); - puts( "Init - Attempt to reset current task's environment" ); - sc = rtems_libio_set_private_env(); - rtems_test_assert( sc == RTEMS_SUCCESSFUL ); - rtems_test_assert( rtems_current_user_env->task_id == current_task_id ); - - puts( "Init - attempt to share the env with another task -- OK" ); - sc = rtems_libio_share_private_env( task_id ); - rtems_test_assert( sc == RTEMS_SUCCESSFUL ); - rtems_test_assert( rtems_current_user_env->task_id == task_id ); - - puts( "Init - attempt to share with self -- OK" ); - sc = rtems_libio_share_private_env( task_id ); - rtems_test_assert( sc == RTEMS_SUCCESSFUL ); + puts( "Init - Reset to global environment" ); + rtems_libio_use_global_env(); + rtems_test_assert( rtems_current_user_env == &rtems_global_user_env ); TEST_END(); diff --git a/testsuites/sptests/spprivenv01/spprivenv01.doc b/testsuites/sptests/spprivenv01/spprivenv01.doc index cb5c1bc45a..71ed4264ed 100644 --- a/testsuites/sptests/spprivenv01/spprivenv01.doc +++ b/testsuites/sptests/spprivenv01/spprivenv01.doc @@ -13,10 +13,9 @@ test set name: spprivenv01 directives: + rtems_libio_set_private_env - + rtems_libio_share_private_env concepts: -+ Exercise the routines at privateenv.c, which reset/share a task's -private environment ++ Exercise the routines at privateenv.c, which reset a task's private +environment diff --git a/testsuites/sptests/spprivenv01/spprivenv01.scn b/testsuites/sptests/spprivenv01/spprivenv01.scn index b95832ced2..1b71be185b 100644 --- a/testsuites/sptests/spprivenv01/spprivenv01.scn +++ b/testsuites/sptests/spprivenv01/spprivenv01.scn @@ -1,17 +1,14 @@ -*** TEST USER ENVIRONMENT ROUTINE - 01 *** +*** BEGIN OF TEST SPPRIVENV 1 *** Init - allocating most of heap -- OK Init - attempt to reset env - expect RTEMS_NO_MEMORY Init - freeing the allocated memory Init - allocating most of workspace memory -Init - attempt to reset env - expect RTEMS_NO_MEMORY +Init - attempt to reset env - expect RTEMS_TOO_MANY Init - freeing the workspace memory +Init - Attempt to get a private environment Init - creating a task name and a task -- OK Init - starting the task_routine, to set its private environment -Init - attempt to share the env with another task -- Expect error task_routine - setting up a private environment -Init - attempt to share the env with another task -- OK -Init - Get current task id -Init - Attempt to reset current task's environment -Init - attempt to share the env with another task -- OK -Init - attempt to share with self -- OK -*** END OF TEST USER ENVIRONMENT ROUTINE - 01 *** +Init - Check current private environment. Should be same as before. +Init - Reset to global environment +*** END OF TEST SPPRIVENV 1 *** -- cgit v1.2.3