From 6cd4a5ca2e2211c4008d99fc272412c9b03c86ce Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Wed, 19 Mar 2014 17:17:39 +0100 Subject: 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. --- cpukit/libmisc/shell/shell.c | 56 ++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 18 deletions(-) (limited to 'cpukit/libmisc/shell/shell.c') 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 #include #include +#include +#include -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 @@ -98,6 +101,24 @@ static void rtems_shell_env_free( free( ptr ); } +/* + * 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 */ @@ -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; } -- cgit v1.2.3