hjl / source-git / glibc

Forked from source-git/glibc 3 years ago
Clone

Blame sunrpc/rpc_thread.c

Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <rpc/rpc.h>
Packit 6c4009
#include <assert.h>
Packit 6c4009
Packit 6c4009
#include <libc-lock.h>
Packit 6c4009
#include <libc-tsd.h>
Packit 6c4009
#include <shlib-compat.h>
Packit 6c4009
#include <libc-symbols.h>
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* Variable used in non-threaded applications or for the first thread.  */
Packit 6c4009
static struct rpc_thread_variables __libc_tsd_RPC_VARS_mem;
Packit 6c4009
static __thread struct rpc_thread_variables *thread_rpc_vars
Packit 6c4009
        attribute_tls_model_ie;
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Task-variable destructor
Packit 6c4009
 */
Packit 6c4009
void
Packit 6c4009
__rpc_thread_destroy (void)
Packit 6c4009
{
Packit 6c4009
	struct rpc_thread_variables *tvp = thread_rpc_vars;
Packit 6c4009
Packit 6c4009
	if (tvp != NULL) {
Packit 6c4009
		__rpc_thread_svc_cleanup ();
Packit 6c4009
		__rpc_thread_clnt_cleanup ();
Packit 6c4009
		__rpc_thread_key_cleanup ();
Packit 6c4009
		free (tvp->clnt_perr_buf_s);
Packit 6c4009
		free (tvp->clntraw_private_s);
Packit 6c4009
		free (tvp->svcraw_private_s);
Packit 6c4009
		free (tvp->authdes_cache_s);
Packit 6c4009
		free (tvp->authdes_lru_s);
Packit 6c4009
		free (tvp->svc_xports_s);
Packit 6c4009
		free (tvp->svc_pollfd_s);
Packit 6c4009
		if (tvp != &__libc_tsd_RPC_VARS_mem)
Packit 6c4009
			free (tvp);
Packit 6c4009
		thread_rpc_vars = NULL;
Packit 6c4009
	}
Packit 6c4009
}
Packit 6c4009
text_set_element (__libc_subfreeres, __rpc_thread_destroy);
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Initialize RPC multi-threaded operation
Packit 6c4009
 */
Packit 6c4009
static void
Packit 6c4009
rpc_thread_multi (void)
Packit 6c4009
{
Packit 6c4009
  thread_rpc_vars = &__libc_tsd_RPC_VARS_mem;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
struct rpc_thread_variables *
Packit 6c4009
__rpc_thread_variables (void)
Packit 6c4009
{
Packit 6c4009
	__libc_once_define (static, once);
Packit 6c4009
	struct rpc_thread_variables *tvp = thread_rpc_vars;
Packit 6c4009
Packit 6c4009
	if (tvp == NULL) {
Packit 6c4009
		__libc_once (once, rpc_thread_multi);
Packit 6c4009
		tvp = thread_rpc_vars;
Packit 6c4009
		if (tvp == NULL) {
Packit 6c4009
			tvp = calloc (1, sizeof *tvp);
Packit 6c4009
			if (tvp != NULL)
Packit 6c4009
				thread_rpc_vars = tvp;
Packit 6c4009
		}
Packit 6c4009
	}
Packit 6c4009
	return tvp;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* Global variables If we're single-threaded, or if this is the first
Packit 6c4009
   thread using the variable, use the existing global variable.  This
Packit 6c4009
   provides backwards compatibility for existing applications which
Packit 6c4009
   dynamically link against this code.  */
Packit 6c4009
#undef svc_fdset
Packit 6c4009
#undef rpc_createerr
Packit 6c4009
#undef svc_pollfd
Packit 6c4009
#undef svc_max_pollfd
Packit 6c4009
Packit 6c4009
fd_set *
Packit 6c4009
__rpc_thread_svc_fdset (void)
Packit 6c4009
{
Packit 6c4009
	struct rpc_thread_variables *tvp;
Packit 6c4009
Packit 6c4009
	tvp = __rpc_thread_variables ();
Packit 6c4009
	if (tvp == &__libc_tsd_RPC_VARS_mem)
Packit 6c4009
		return &svc_fdset;
Packit 6c4009
	return &tvp->svc_fdset_s;
Packit 6c4009
}
Packit 6c4009
libc_hidden_nolink_sunrpc (__rpc_thread_svc_fdset, GLIBC_2_2_3)
Packit 6c4009
Packit 6c4009
struct rpc_createerr *
Packit 6c4009
__rpc_thread_createerr (void)
Packit 6c4009
{
Packit 6c4009
	struct rpc_thread_variables *tvp;
Packit 6c4009
Packit 6c4009
	tvp = __rpc_thread_variables ();
Packit 6c4009
	if (tvp == &__libc_tsd_RPC_VARS_mem)
Packit 6c4009
		return &rpc_createerr;
Packit 6c4009
	return &tvp->rpc_createerr_s;
Packit 6c4009
}
Packit 6c4009
libc_hidden_nolink_sunrpc (__rpc_thread_createerr, GLIBC_2_2_3)
Packit 6c4009
Packit 6c4009
struct pollfd **
Packit 6c4009
__rpc_thread_svc_pollfd (void)
Packit 6c4009
{
Packit 6c4009
	struct rpc_thread_variables *tvp;
Packit 6c4009
Packit 6c4009
	tvp = __rpc_thread_variables ();
Packit 6c4009
	if (tvp == &__libc_tsd_RPC_VARS_mem)
Packit 6c4009
		return &svc_pollfd;
Packit 6c4009
	return &tvp->svc_pollfd_s;
Packit 6c4009
}
Packit 6c4009
#ifdef EXPORT_RPC_SYMBOLS
Packit 6c4009
libc_hidden_def (__rpc_thread_svc_pollfd)
Packit 6c4009
#else
Packit 6c4009
libc_hidden_nolink_sunrpc (__rpc_thread_svc_pollfd, GLIBC_2_2_3)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
int *
Packit 6c4009
__rpc_thread_svc_max_pollfd (void)
Packit 6c4009
{
Packit 6c4009
	struct rpc_thread_variables *tvp;
Packit 6c4009
Packit 6c4009
	tvp = __rpc_thread_variables ();
Packit 6c4009
	if (tvp == &__libc_tsd_RPC_VARS_mem)
Packit 6c4009
		return &svc_max_pollfd;
Packit 6c4009
	return &tvp->svc_max_pollfd_s;
Packit 6c4009
}
Packit 6c4009
#ifdef EXPORT_RPC_SYMBOLS
Packit 6c4009
libc_hidden_def (__rpc_thread_svc_max_pollfd)
Packit 6c4009
#else
Packit 6c4009
libc_hidden_nolink_sunrpc (__rpc_thread_svc_max_pollfd, GLIBC_2_2_3)
Packit 6c4009
#endif