[rtems commit] privateenv: Remove sharing of user environment between threads.

Sebastian Huber sebh at rtems.org
Thu Mar 27 13:45:14 UTC 2014


Module:    rtems
Branch:    master
Commit:    7d5c27e308632cce2052eb2aaf6a601aa0b5bc17
Changeset: http://git.rtems.org/rtems/commit/?id=7d5c27e308632cce2052eb2aaf6a601aa0b5bc17

Author:    Christian Mauderer <Christian.Mauderer at embedded-brains.de>
Date:      Thu Mar 27 14:23:20 2014 +0100

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 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 ***




More information about the vc mailing list