Quick glance looks OK, but I leave it up to Sebastian or Chris to approve.
On Wed, Mar 26, 2014 at 8:29 AM, Christian Mauderer <christian.maude...@embedded-brains.de> wrote: > From: Christian Mauderer <christian.maude...@embedded-brains.de> > > --- > 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 7d874d3..8a9a4fc 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; > @@ -97,23 +94,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. > * > * A private environment will be released. This function may be called from > diff --git a/cpukit/libcsupport/src/privateenv.c > b/cpukit/libcsupport/src/privateenv.c > index c7a65a5..bee94c1 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 5980be8..3a47c46 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 fdcf959..13cd709 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 f60bcef..a670085 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 cb5c1bc..71ed426 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 b95832c..1b71be1 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 *** > -- > 1.8.4.5 > > _______________________________________________ > rtems-devel mailing list > rtems-devel@rtems.org > http://www.rtems.org/mailman/listinfo/rtems-devel _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel