aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--malloc/arena.c5
-rw-r--r--malloc/malloc.c23
3 files changed, 29 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index d9222a5..9a9efa5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2017-11-23 Florian Weimer <fweimer@redhat.com>
+ * malloc/malloc.c (tcache_thread_shutdown): Rename from
+ tcache_thread_freeres. Define for USE_TCACHE and !USE_TCACHE
+ alike. Remove freeres marker.
+ * malloc/arena.c (arena_thread_freeres): Call
+ tcache_thread_shutdown.
+
+2017-11-23 Florian Weimer <fweimer@redhat.com>
+
[BZ #22459]
Export nscd hash function as __nss_hash.
* include/nss.h (__nss_hash): Declare.
diff --git a/malloc/arena.c b/malloc/arena.c
index 85b985e..4d27e17 100644
--- a/malloc/arena.c
+++ b/malloc/arena.c
@@ -944,6 +944,11 @@ arena_get_retry (mstate ar_ptr, size_t bytes)
static void __attribute__ ((section ("__libc_thread_freeres_fn")))
arena_thread_freeres (void)
{
+ /* Shut down the thread cache first. This could deallocate data for
+ the thread arena, so do this before we put the arena on the free
+ list. */
+ tcache_thread_shutdown ();
+
mstate a = thread_arena;
thread_arena = NULL;
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 2999ac4..79f0e9e 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1869,6 +1869,9 @@ void *weak_variable (*__memalign_hook)
= memalign_hook_ini;
void weak_variable (*__after_morecore_hook) (void) = NULL;
+/* This function is called from the arena shutdown hook, to free the
+ thread cache (if it exists). */
+static void tcache_thread_shutdown (void);
/* ------------------ Testing support ----------------------------------*/
@@ -2938,8 +2941,8 @@ tcache_get (size_t tc_idx)
return (void *) e;
}
-static void __attribute__ ((section ("__libc_thread_freeres_fn")))
-tcache_thread_freeres (void)
+static void
+tcache_thread_shutdown (void)
{
int i;
tcache_perthread_struct *tcache_tmp = tcache;
@@ -2965,7 +2968,6 @@ tcache_thread_freeres (void)
__libc_free (tcache_tmp);
}
-text_set_element (__libc_thread_subfreeres, tcache_thread_freeres);
static void
tcache_init(void)
@@ -3002,13 +3004,20 @@ tcache_init(void)
}
-#define MAYBE_INIT_TCACHE() \
+# define MAYBE_INIT_TCACHE() \
if (__glibc_unlikely (tcache == NULL)) \
tcache_init();
-#else
-#define MAYBE_INIT_TCACHE()
-#endif
+#else /* !USE_TCACHE */
+# define MAYBE_INIT_TCACHE()
+
+static void
+tcache_thread_shutdown (void)
+{
+ /* Nothing to do if there is no thread cache. */
+}
+
+#endif /* !USE_TCACHE */
void *
__libc_malloc (size_t bytes)