]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
malloc: Call tcache destructor in arena_thread_freeres
authorFlorian Weimer <fweimer@redhat.com>
Thu, 23 Nov 2017 13:47:31 +0000 (14:47 +0100)
committerFlorian Weimer <fweimer@redhat.com>
Thu, 23 Nov 2017 13:47:31 +0000 (14:47 +0100)
It does not make sense to register separate cleanup functions for arena
and tcache since they're always going to be called together.  Call the
tcache cleanup function from within arena_thread_freeres since it at
least makes the order of those cleanups clear in the code.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
ChangeLog
malloc/arena.c
malloc/malloc.c

index d9222a58d2db919da3e880fe4a5eca8a5d1732bd..9a9efa54d4309a2d7eb35525de75fe6f1cd0e1ac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+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]
index 85b985e193d513b633bd148b275515a29a710584..4d27e17c46aaba2ca5c84380b38a5aa1598a77e4 100644 (file)
@@ -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;
 
index 2999ac4d2f883df355dc25d4da15f2563a25bbd0..79f0e9eac7483b3fba19849a44029b5e8ba3bd33 100644 (file)
@@ -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)