summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/shell/shell.c
diff options
context:
space:
mode:
authorChristian Mauderer <Christian.Mauderer@embedded-brains.de>2014-03-19 17:17:39 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-03-20 09:10:26 +0100
commit6cd4a5ca2e2211c4008d99fc272412c9b03c86ce (patch)
tree74d90861edc8f206824e462710679b69b46b2aa6 /cpukit/libmisc/shell/shell.c
parenttests/libtests: Use <rtems/test.h> (diff)
downloadrtems-6cd4a5ca2e2211c4008d99fc272412c9b03c86ce.tar.bz2
cpukit/shell: Replace task variables with posix keys.
Use posix keys for current shell environment instead of task variables. With this patch the shell needs one posix-key and one posix-key-value-pair configured. Update documentation for the shell. Adapt samples/fileio: - Add necessary objects. - Add login function and custom device name for better testing of the shell.
Diffstat (limited to 'cpukit/libmisc/shell/shell.c')
-rw-r--r--cpukit/libmisc/shell/shell.c56
1 files changed, 38 insertions, 18 deletions
diff --git a/cpukit/libmisc/shell/shell.c b/cpukit/libmisc/shell/shell.c
index 90bb51253e..9fa56b6081 100644
--- a/cpukit/libmisc/shell/shell.c
+++ b/cpukit/libmisc/shell/shell.c
@@ -37,8 +37,10 @@
#include <unistd.h>
#include <errno.h>
#include <pwd.h>
+#include <pthread.h>
+#include <assert.h>
-rtems_shell_env_t rtems_global_shell_env = {
+static rtems_shell_env_t rtems_global_shell_env = {
.magic = rtems_build_name('S', 'E', 'N', 'V'),
.devname = CONSOLE_DEVICE_NAME,
.taskname = "SHGL",
@@ -54,7 +56,8 @@ rtems_shell_env_t rtems_global_shell_env = {
.login_check = NULL
};
-rtems_shell_env_t *rtems_current_shell_env = &rtems_global_shell_env;
+static pthread_once_t rtems_shell_current_env_once = PTHREAD_ONCE_INIT;
+static pthread_key_t rtems_shell_current_env_key;
/*
* Initialize the shell user/process environment information
@@ -99,6 +102,24 @@ static void rtems_shell_env_free(
}
/*
+ * Create the posix key.
+ */
+static void rtems_shell_current_env_make_key(void)
+{
+ (void) pthread_key_create(&rtems_shell_current_env_key, rtems_shell_env_free);
+}
+
+/*
+ * Return the current shell environment
+ */
+rtems_shell_env_t *rtems_shell_get_current_env(void)
+{
+ void *ptr = pthread_getspecific(rtems_shell_current_env_key);
+ assert (ptr != NULL);
+ return (rtems_shell_env_t *) ptr;
+}
+
+/*
* Get a line of user input with modest features
*/
static int rtems_shell_line_editor(
@@ -650,6 +671,7 @@ bool rtems_shell_main_loop(
rtems_shell_env_t *shell_env;
rtems_shell_cmd_t *shell_cmd;
rtems_status_code sc;
+ int eno;
struct termios term;
struct termios previous_term;
char *prompt = NULL;
@@ -667,23 +689,21 @@ bool rtems_shell_main_loop(
rtems_shell_initialize_command_set();
- shell_env =
- rtems_current_shell_env = rtems_shell_init_env( shell_env_arg );
-
- /*
- * @todo chrisj
- * Remove the use of task variables. Change to have a single
- * allocation per shell and then set into a notepad register
- * in the TCB. Provide a function to return the pointer.
- * Task variables are a virus to embedded systems software.
- */
- sc = rtems_task_variable_add(
- RTEMS_SELF,
- (void*)&rtems_current_shell_env,
- rtems_shell_env_free
+ eno = pthread_once(
+ &rtems_shell_current_env_once,
+ rtems_shell_current_env_make_key
);
- if (sc != RTEMS_SUCCESSFUL) {
- rtems_error(sc,"rtems_task_variable_add(current_shell_env):");
+ assert(eno == 0);
+
+ shell_env = rtems_shell_init_env(shell_env_arg);
+ if (shell_env == NULL) {
+ rtems_error(0, "rtems_shell_init_env");
+ return false;
+ }
+
+ eno = pthread_setspecific(rtems_shell_current_env_key, shell_env);
+ if (eno != 0) {
+ rtems_error(0, "pthread_setspecific(shell_current_env_key)");
return false;
}