[rtems commit] librpc: Use POSIX key instead of task variables
Joel Sherrill
joel.sherrill at OARcorp.com
Mon Mar 24 16:59:59 UTC 2014
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 <Christian.Mauderer at embedded-brains.de>
> 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
> rtems-vc at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-vc
--
Joel Sherrill, Ph.D. Director of Research & Development
joel.sherrill at OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
More information about the devel
mailing list