Grep'ing to see what was left, I see two things:

+ privateenv.c

+ rpc used task_variable in the names of its types and data.
Should that be changed?

--joel

On 3/24/2014 2:25 AM, Sebastian Huber wrote:
> Module:    rtems
> Branch:    master
> Commit:    8e133b25005947879113a46cc33414dfbcce6123
> Changeset: 
> http://git.rtems.org/rtems/commit/?id=8e133b25005947879113a46cc33414dfbcce6123
>
> Author:    Christian Mauderer <[email protected]>
> Date:      Fri Mar 21 14:17:19 2014 +0100
>
> librpc: Use POSIX key instead of task variables
>
> ---
>
>  cpukit/librpc/include/rpc/rpc.h   |    4 ++-
>  cpukit/librpc/src/rpc/rtems_rpc.c |   60 +++++++++++++++++++++++++++---------
>  2 files changed, 48 insertions(+), 16 deletions(-)
>
> diff --git a/cpukit/librpc/include/rpc/rpc.h b/cpukit/librpc/include/rpc/rpc.h
> index 95df085..20065ef 100644
> --- a/cpukit/librpc/include/rpc/rpc.h
> +++ b/cpukit/librpc/include/rpc/rpc.h
> @@ -104,7 +104,9 @@ struct _rtems_rpc_task_variables {
>  
>       struct authsvc *svc_auths_Auths;
>  };
> -extern struct _rtems_rpc_task_variables *rtems_rpc_task_variables;
> +
> +struct _rtems_rpc_task_variables *rtems_rpc_task_variables_get(void);
> +#define rtems_rpc_task_variables rtems_rpc_task_variables_get()
>  
>  #define svc_maxfd (rtems_rpc_task_variables->svc_svc_maxfd)
>  #define svc_fdset (rtems_rpc_task_variables->svc_svc_fdset)
> diff --git a/cpukit/librpc/src/rpc/rtems_rpc.c 
> b/cpukit/librpc/src/rpc/rtems_rpc.c
> index 5d31f12..b1efb61 100644
> --- a/cpukit/librpc/src/rpc/rtems_rpc.c
> +++ b/cpukit/librpc/src/rpc/rtems_rpc.c
> @@ -9,6 +9,8 @@
>  #include <rpc/rpc.h>
>  #include <rtems.h>
>  #include <stdlib.h>
> +#include <pthread.h>
> +#include <assert.h>
>  
>  /*
>   * RPC variables for single-thread
> @@ -61,35 +63,63 @@ static const struct _rtems_rpc_task_variables rpc_init = {
>  /*
>   * Per-task pointer to RPC data
>   */
> -struct _rtems_rpc_task_variables *rtems_rpc_task_variables = &rpc_default;
> +static pthread_once_t rtems_rpc_task_variable_once = PTHREAD_ONCE_INIT;
> +static pthread_key_t rtems_rpc_task_variable_key;
> +
> +/*
> + * Return the current task variable pointer.
> + */
> +struct _rtems_rpc_task_variables *rtems_rpc_task_variables_get (void)
> +{
> +     void *ptr = pthread_getspecific(rtems_rpc_task_variable_key);
> +     if (ptr == NULL) {
> +             ptr = &rpc_default;
> +     }
> +     return (struct _rtems_rpc_task_variables *) ptr;
> +}
> +
> +/*
> + * Key create function for task_variable_key.
> + */
> +static void rtems_rpc_task_variable_make_key (void)
> +{
> +     int eno = pthread_key_create(&rtems_rpc_task_variable_key, NULL);
> +     assert (eno == 0);
> +     /*
> +      * FIXME: Should have destructor which cleans up
> +      * all RPC stuff:
> +      *  - Close all files
> +      *  - Go through and free linked list elements
> +      *  - Free other allocated memory (e.g. clnt_perror_buf)
> +      */
> +}
>  
>  /*
>   * Set up per-task RPC variables
>   */
>  int rtems_rpc_task_init (void)
>  {
> -     rtems_status_code sc;
>       struct _rtems_rpc_task_variables *tvp;
> +     int eno = 0;
> +
> +     eno = pthread_once(
> +             &rtems_rpc_task_variable_once,
> +             rtems_rpc_task_variable_make_key
> +     );
> +     assert (eno == 0);
>  
> -     if (rtems_rpc_task_variables == &rpc_default) {
> +     tvp = pthread_getspecific (rtems_rpc_task_variable_key);
> +     if (tvp == NULL) {
>               tvp = malloc (sizeof *tvp);
>               if (tvp == NULL)
>                       return RTEMS_NO_MEMORY;
> -             /*
> -              * FIXME: Should have destructor which cleans up
> -              * all RPC stuff:
> -              *      - Close all files
> -              *      - Go through and free linked list elements
> -              *      - Free other allocated memory (e.g. clnt_perror_buf)
> -              */
> -             sc = rtems_task_variable_add (
> -                     RTEMS_SELF, (void *)&rtems_rpc_task_variables, NULL);
> -             if (sc != RTEMS_SUCCESSFUL) {
> +
> +             eno = pthread_setspecific (rtems_rpc_task_variable_key, (void 
> *) tvp);
> +             if (eno != 0) {
>                       free (tvp);
> -                     return sc;
> +                     return RTEMS_INTERNAL_ERROR;
>               }
>               *tvp = rpc_init;
> -             rtems_rpc_task_variables = tvp;
>       }
>       return RTEMS_SUCCESSFUL;
>  }
>
> _______________________________________________
> rtems-vc mailing list
> [email protected]
> http://www.rtems.org/mailman/listinfo/rtems-vc

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
[email protected]        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
Support Available                (256) 722-9985

_______________________________________________
rtems-devel mailing list
[email protected]
http://www.rtems.org/mailman/listinfo/rtems-devel

Reply via email to