aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--include/resolv.h1
-rw-r--r--malloc/thread-freeres.c2
-rw-r--r--resolv/res_init.c24
-rw-r--r--sunrpc/rpc_thread.c4
5 files changed, 42 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index a10cc32201..bfc5e15e03 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,18 @@
2003-02-21 Roland McGrath <roland@redhat.com>
- * malloc/Versions (GLIBC_PRIVATE): Add __libc_thread_freeres.
+ * malloc/thread-freeres.c: Conditionalize on _LIBC_REENTRANT.
+ * sunrpc/rpc_thread.c: Likewise for text_set_element use.
+ (__rpc_thread_destroy): Add it to __libc_subfreeres too.
+
+ * include/resolv.h: Add libc_hidden_proto for __res_nclose.
+ * resolv/res_init.c (__res_nclose): Add libc_hidden_def.
+ (res_thread_freeres): New function, on __libc_thread_subfreeres and
+ __libc_subfreeres.
+
+ * malloc/Versions (libc: GLIBC_PRIVATE): Add __libc_thread_freeres.
* malloc/thread-freeres.c: New file.
* malloc/Makefile (aux): Add it.
- * sunrpc/Versions (GLIBC_PRIVATE): Removed.
+ * sunrpc/Versions (libc: GLIBC_PRIVATE): Removed.
* sunrpc/rpc_thread.c (__rpc_thread_destroy): Put in special section
"__libc_thread_freeres_fn" and add to __libc_thread_subfreeres set.
diff --git a/include/resolv.h b/include/resolv.h
index f9635dd87d..9d7bb8b9fd 100644
--- a/include/resolv.h
+++ b/include/resolv.h
@@ -45,6 +45,7 @@ extern void res_send_setrhook (res_send_rhook __hook);
extern int res_ourserver_p (const res_state __statp,
const struct sockaddr_in6 *__inp);
libc_hidden_proto (__res_ninit)
+libc_hidden_proto (__res_nclose)
libc_hidden_proto (__res_randomid)
libc_hidden_proto (__res_state)
diff --git a/malloc/thread-freeres.c b/malloc/thread-freeres.c
index 75d3014d6e..cc9db39202 100644
--- a/malloc/thread-freeres.c
+++ b/malloc/thread-freeres.c
@@ -21,6 +21,7 @@
#include <libc-internal.h>
#include <set-hooks.h>
+#ifdef _LIBC_REENTRANT
DEFINE_HOOK (__libc_thread_subfreeres, (void));
void __attribute__ ((section ("__libc_thread_freeres_fn")))
@@ -28,3 +29,4 @@ __libc_thread_freeres (void)
{
RUN_HOOK (__libc_thread_subfreeres, ());
}
+#endif
diff --git a/resolv/res_init.c b/resolv/res_init.c
index 764e571029..459694fbd4 100644
--- a/resolv/res_init.c
+++ b/resolv/res_init.c
@@ -528,6 +528,7 @@ res_randomid(void) {
libc_hidden_def (__res_randomid)
#endif
+
/*
* This routine is for closing the socket if a virtual circuit is used and
* the program wants to close it. This provides support for endhostent()
@@ -556,3 +557,26 @@ res_nclose(res_state statp) {
}
statp->_u._ext.nsinit = 0;
}
+#ifdef _LIBC
+libc_hidden_def (__res_nclose)
+#endif
+
+#ifdef _LIBC
+# ifdef _LIBC_REENTRANT
+/* This is called when a thread is exiting to free resources held in _res. */
+static void __attribute__ ((section ("__libc_thread_freeres_fn")))
+res_thread_freeres (void)
+{
+ __res_nclose (&_res); /* Close any VC sockets. */
+
+ for (int ns = 0; ns < MAXNS; ns++)
+ if (_res._u._ext.nsaddrs[ns] != NULL)
+ {
+ free (_res._u._ext.nsaddrs[ns]);
+ _res._u._ext.nsaddrs[ns] = NULL;
+ }
+}
+text_set_element (__libc_thread_subfreeres, res_thread_freeres);
+text_set_element (__libc_subfreeres, res_thread_freeres);
+# endif
+#endif
diff --git a/sunrpc/rpc_thread.c b/sunrpc/rpc_thread.c
index 9a3d4dbd0c..fbc1cf72fe 100644
--- a/sunrpc/rpc_thread.c
+++ b/sunrpc/rpc_thread.c
@@ -30,9 +30,13 @@ __rpc_thread_destroy (void)
free (tvp->authdes_cache_s);
free (tvp->authdes_lru_s);
free (tvp);
+ __libc_tsd_set (RPC_VARS, NULL);
}
}
+#ifdef _LIBC_REENTRANT
text_set_element (__libc_thread_subfreeres, __rpc_thread_destroy);
+#endif
+text_set_element (__libc_subfreeres, __rpc_thread_destroy);
/*