1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-06-02 02:01:46 +03:00
glibc/sunrpc/rpc_thread.c
Joseph Myers 02d55fe04e Rename bits/libc-tsd.h to libc-tsd.h (bug 14912).
It was noted in
<https://sourceware.org/ml/libc-alpha/2012-09/msg00305.html> that the
bits/*.h naming scheme should only be used for installed headers.
This patch renames bits/libc-tsd.h to plain libc-tsd.h to follow that
convention.

Tested for x86_64 (testing, and that installed stripped shared
libraries are unchanged by the patch).

	[BZ #14912]
	* bits/libc-tsd.h: Move to ...
	* sysdeps/generic/libc-tsd.h: ...here.
	(_GENERIC_BITS_LIBC_TSD_H): Rename macro to _GENERIC_LIBC_TSD_H.
	* sysdeps/mach/hurd/bits/libc-tsd.h: Move to ...
	* sysdeps/mach/hurd/libc-tsd.h: ...here.
	(_BITS_LIBC_TSD_H): Rename macro to _LIBC_TSD_H.
	* include/ctype.h: Include <libc-tsd.h> instead of
	<bits/libc-tsd.h>.
	* include/rpc/rpc.h: Likewise.
	* locale/localeinfo.h: Likewise.
	* sunrpc/rpc_thread.c: Likewise.
	* sysdeps/mach/hurd/malloc-machine.h: Likewise.
	* sysdeps/nptl/malloc-machine.h: Likewise.
2015-09-03 20:33:46 +00:00

147 lines
3.5 KiB
C

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