diff options
author | Ondřej Bílka <neleai@seznam.cz> | 2014-02-26 13:13:09 +0100 |
---|---|---|
committer | Ondřej Bílka <neleai@seznam.cz> | 2014-02-26 13:15:33 +0100 |
commit | 4248f0da6ff9e7dd63464cdecec2dec332dfc2f0 (patch) | |
tree | 1f645ac4c027603f3535fd36a6cd38cb63375169 /malloc | |
parent | ade40b10ff5fa59a318cf55b9d8414b758e8df78 (diff) | |
download | glibc-4248f0da6ff9e7dd63464cdecec2dec332dfc2f0.tar.gz |
Simplify calloc implementation.
To make future improvements of allocator simpler we could for now calloc
just call malloc and memset. With that we could omit a changes that
would duplicate malloc changes anyway.
Diffstat (limited to 'malloc')
-rw-r--r-- | malloc/malloc.c | 115 |
1 files changed, 6 insertions, 109 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c index 9a45707ee7..74ad92dbd0 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -3141,13 +3141,8 @@ __libc_pvalloc (size_t bytes) void * __libc_calloc (size_t n, size_t elem_size) { - mstate av; - mchunkptr oldtop, p; - INTERNAL_SIZE_T bytes, sz, csz, oldtopsize; + INTERNAL_SIZE_T bytes; void *mem; - unsigned long clearsize; - unsigned long nclears; - INTERNAL_SIZE_T *d; /* size_t is unsigned so the behavior on overflow is defined. */ bytes = n * elem_size; @@ -3166,113 +3161,15 @@ __libc_calloc (size_t n, size_t elem_size) atomic_forced_read (__malloc_hook); if (__builtin_expect (hook != NULL, 0)) { - sz = bytes; - mem = (*hook)(sz, RETURN_ADDRESS (0)); - if (mem == 0) - return 0; - - return memset (mem, 0, sz); - } - - sz = bytes; - - arena_get (av, sz); - if (!av) - return 0; - - /* Check if we hand out the top chunk, in which case there may be no - need to clear. */ -#if MORECORE_CLEARS - oldtop = top (av); - oldtopsize = chunksize (top (av)); -# if MORECORE_CLEARS < 2 - /* Only newly allocated memory is guaranteed to be cleared. */ - if (av == &main_arena && - oldtopsize < mp_.sbrk_base + av->max_system_mem - (char *) oldtop) - oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *) oldtop); -# endif - if (av != &main_arena) - { - heap_info *heap = heap_for_ptr (oldtop); - if (oldtopsize < (char *) heap + heap->mprotect_size - (char *) oldtop) - oldtopsize = (char *) heap + heap->mprotect_size - (char *) oldtop; - } -#endif - mem = _int_malloc (av, sz); - - - assert (!mem || chunk_is_mmapped (mem2chunk (mem)) || - av == arena_for_chunk (mem2chunk (mem))); - - if (mem == 0) - { - LIBC_PROBE (memory_calloc_retry, 1, sz); - av = arena_get_retry (av, sz); - if (__builtin_expect (av != NULL, 1)) - { - mem = _int_malloc (av, sz); - (void) mutex_unlock (&av->mutex); - } - if (mem == 0) - return 0; + mem = (*hook)(bytes, RETURN_ADDRESS (0)); } else - (void) mutex_unlock (&av->mutex); - p = mem2chunk (mem); - - /* Two optional cases in which clearing not necessary */ - if (chunk_is_mmapped (p)) - { - if (__builtin_expect (perturb_byte, 0)) - return memset (mem, 0, sz); - - return mem; - } + mem = __libc_malloc (bytes); - csz = chunksize (p); - -#if MORECORE_CLEARS - if (perturb_byte == 0 && (p == oldtop && csz > oldtopsize)) - { - /* clear only the bytes from non-freshly-sbrked memory */ - csz = oldtopsize; - } -#endif - - /* Unroll clear of <= 36 bytes (72 if 8byte sizes). We know that - contents have an odd number of INTERNAL_SIZE_T-sized words; - minimally 3. */ - d = (INTERNAL_SIZE_T *) mem; - clearsize = csz - SIZE_SZ; - nclears = clearsize / sizeof (INTERNAL_SIZE_T); - assert (nclears >= 3); - - if (nclears > 9) - return memset (d, 0, clearsize); - - else - { - *(d + 0) = 0; - *(d + 1) = 0; - *(d + 2) = 0; - if (nclears > 4) - { - *(d + 3) = 0; - *(d + 4) = 0; - if (nclears > 6) - { - *(d + 5) = 0; - *(d + 6) = 0; - if (nclears > 8) - { - *(d + 7) = 0; - *(d + 8) = 0; - } - } - } - } + if (mem == 0) + return 0; - return mem; + return memset (mem, 0, bytes); } /* |