mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-30 22:43:12 +03:00
malloc: Cleanup tcache_init()
Cleanup tcache_init() by using the new __libc_malloc2 interface. Reviewed-by: Cupertino Miranda <cupertino.miranda@oracle.com>
This commit is contained in:
@ -590,7 +590,7 @@ tag_at (void *ptr)
|
|||||||
differs across systems, but is in all cases less than the maximum
|
differs across systems, but is in all cases less than the maximum
|
||||||
representable value of a size_t.
|
representable value of a size_t.
|
||||||
*/
|
*/
|
||||||
void* __libc_malloc(size_t);
|
void *__libc_malloc (size_t);
|
||||||
libc_hidden_proto (__libc_malloc)
|
libc_hidden_proto (__libc_malloc)
|
||||||
|
|
||||||
static void *__libc_calloc2 (size_t);
|
static void *__libc_calloc2 (size_t);
|
||||||
@ -3374,13 +3374,11 @@ tcache_thread_shutdown (void)
|
|||||||
__libc_free (tcache_tmp);
|
__libc_free (tcache_tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize tcache. In the rare case there isn't any memory available,
|
||||||
|
later calls will retry initialization. */
|
||||||
static void
|
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)
|
if (tcache_shutting_down)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -3389,31 +3387,15 @@ tcache_init(void)
|
|||||||
if (MAX_TCACHE_SMALL_SIZE >= GLRO (dl_pagesize) / 2)
|
if (MAX_TCACHE_SMALL_SIZE >= GLRO (dl_pagesize) / 2)
|
||||||
malloc_printerr ("max tcache size too large");
|
malloc_printerr ("max tcache size too large");
|
||||||
|
|
||||||
arena_get (ar_ptr, bytes);
|
size_t bytes = sizeof (tcache_perthread_struct);
|
||||||
victim = _int_malloc (ar_ptr, bytes);
|
tcache = (tcache_perthread_struct *) __libc_malloc2 (bytes);
|
||||||
if (!victim && ar_ptr != NULL)
|
|
||||||
|
if (tcache != NULL)
|
||||||
{
|
{
|
||||||
ar_ptr = arena_get_retry (ar_ptr, bytes);
|
memset (tcache, 0, bytes);
|
||||||
victim = _int_malloc (ar_ptr, 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)
|
|
||||||
{
|
|
||||||
tcache = (tcache_perthread_struct *) victim;
|
|
||||||
memset (tcache, 0, sizeof (tcache_perthread_struct));
|
|
||||||
for (int i = 0; i < TCACHE_MAX_BINS; i++)
|
for (int i = 0; i < TCACHE_MAX_BINS; i++)
|
||||||
tcache->num_slots[i] = mp_.tcache_count;
|
tcache->num_slots[i] = mp_.tcache_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void * __attribute_noinline__
|
static void * __attribute_noinline__
|
||||||
|
Reference in New Issue
Block a user