[PATCH v3] malloc: Cleanup tcache_init()

Wilco Dijkstra Wilco.Dijkstra@arm.com
Wed Jun 18 13:35:28 GMT 2025


v3: rebase after large tcache changes

Cleanup tcache_init() by using the new __libc_malloc2 interface.

Passes regress, OK for commit?

---

diff --git a/malloc/malloc.c b/malloc/malloc.c
index 3f91ff44b35136c5c1a9b2e1b67bd9f987d3d067..89f961132cd416e194cdaf4cb22057a327c04688 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -590,7 +590,7 @@ tag_at (void *ptr)
   differs across systems, but is in all cases less than the maximum
   representable value of a size_t.
 */
-void*  __libc_malloc(size_t);
+void *__libc_malloc (size_t);
 libc_hidden_proto (__libc_malloc)
 
 static void *__libc_calloc2 (size_t);
@@ -3376,13 +3376,11 @@ tcache_thread_shutdown (void)
   __libc_free (tcache_tmp);
 }
 
+/* Initialize tcache.  In the rare case there isn't any memory available,
+   later calls will retry initialization.  */
 static void
-tcache_init(void)
+tcache_init (void)
 {
-  mstate ar_ptr;
-  void *victim = NULL;
-  const size_t bytes = sizeof (tcache_perthread_struct);
-
   if (tcache_shutting_down)
     return;
 
@@ -3391,31 +3389,15 @@ tcache_init(void)
   if (MAX_TCACHE_SMALL_SIZE >= GLRO (dl_pagesize) / 2)
     malloc_printerr ("max tcache size too large");
 
-  arena_get (ar_ptr, bytes);
-  victim = _int_malloc (ar_ptr, bytes);
-  if (!victim && ar_ptr != NULL)
-    {
-      ar_ptr = arena_get_retry (ar_ptr, bytes);
-      victim = _int_malloc (ar_ptr, bytes);
-    }
-
+  size_t bytes = sizeof (tcache_perthread_struct);
+  tcache = (tcache_perthread_struct *) __libc_malloc2 (bytes);
 
-  if (ar_ptr != NULL)
-    __libc_lock_unlock (ar_ptr->mutex);
-
-  /* In a low memory situation, we may not be able to allocate memory
-     - in which case, we just keep trying later.  However, we
-     typically do this very early, so either there is sufficient
-     memory, or there isn't enough memory to do non-trivial
-     allocations anyway.  */
-  if (victim)
+  if (tcache != NULL)
     {
-      tcache = (tcache_perthread_struct *) victim;
-      memset (tcache, 0, sizeof (tcache_perthread_struct));
+      memset (tcache, 0, bytes);
       for (int i = 0; i < TCACHE_MAX_BINS; i++)
 	tcache->num_slots[i] = mp_.tcache_count;
     }
-
 }
 
 static void * __attribute_noinline__



More information about the Libc-alpha mailing list