diff options
Diffstat (limited to 'libc/inet/rpc/rpc_thread.c')
-rw-r--r-- | libc/inet/rpc/rpc_thread.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/libc/inet/rpc/rpc_thread.c b/libc/inet/rpc/rpc_thread.c index 09bff0dd1..7262190df 100644 --- a/libc/inet/rpc/rpc_thread.c +++ b/libc/inet/rpc/rpc_thread.c @@ -1,21 +1,37 @@ #define __FORCE_GLIBC #include <features.h> - #include <stdio.h> -#include <rpc/rpc.h> #include <assert.h> - -#ifdef _RPC_THREAD_SAFE_ - -#include <bits/libc-lock.h> #include <bits/libc-tsd.h> - +#include "rpc_private.h" /* Variable used in non-threaded applications or for the first thread. */ static struct rpc_thread_variables __libc_tsd_RPC_VARS_mem; static struct rpc_thread_variables *__libc_tsd_RPC_VARS_data = &__libc_tsd_RPC_VARS_mem; +#ifdef __UCLIBC_HAS_THREADS__ + + +extern int __pthread_once (pthread_once_t *__once_control, + void (*__init_routine) (void)); +asm (".weak __pthread_once"); + + +# define __libc_once_define(CLASS, NAME) \ + CLASS pthread_once_t NAME = PTHREAD_ONCE_INIT + +/* Call handler iff the first call. */ +#define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \ + do { \ + if (__pthread_once != NULL) \ + __pthread_once (&(ONCE_CONTROL), (INIT_FUNCTION)); \ + else if ((ONCE_CONTROL) == PTHREAD_ONCE_INIT) { \ + INIT_FUNCTION (); \ + (ONCE_CONTROL) = !PTHREAD_ONCE_INIT; \ + } \ + } while (0) + /* * Task-variable destructor */ @@ -27,7 +43,7 @@ __rpc_thread_destroy (void) if (tvp != NULL && tvp != &__libc_tsd_RPC_VARS_mem) { __rpc_thread_svc_cleanup (); __rpc_thread_clnt_cleanup (); - __rpc_thread_key_cleanup (); + //__rpc_thread_key_cleanup (); free (tvp->authnone_private_s); free (tvp->clnt_perr_buf_s); free (tvp->clntraw_private_s); @@ -39,6 +55,8 @@ __rpc_thread_destroy (void) } +#if 0 +#warning fix multithreaded initialization... /* * Initialize RPC multi-threaded operation */ @@ -69,6 +87,12 @@ __rpc_thread_variables (void) } return tvp; } +#else +struct rpc_thread_variables * __rpc_thread_variables (void) +{ + return __libc_tsd_RPC_VARS_data; +} +#endif /* Global variables If we're single-threaded, or if this is the first @@ -154,4 +178,5 @@ int * __rpc_thread_svc_max_pollfd (void) return &(svc_max_pollfd); } -#endif /* _RPC_THREAD_SAFE_ */ +#endif /* __UCLIBC_HAS_THREADS__ */ + |