diff options
author | Jason Evans <je@fb.com> | 2014-01-12 23:05:44 (GMT) |
---|---|---|
committer | Jason Evans <je@fb.com> | 2014-01-12 23:41:05 (GMT) |
commit | b2c31660be917ea6d59cd54e6f650b06b5e812ed (patch) | |
tree | 2642e518d63ce4ebd4e50f074ab0a425fa1497ba /src/arena.c | |
parent | 6b694c4d47278cddfaaedeb7ee49fa5757e35ed5 (diff) | |
download | jemalloc-b2c31660be917ea6d59cd54e6f650b06b5e812ed.zip jemalloc-b2c31660be917ea6d59cd54e6f650b06b5e812ed.tar.gz jemalloc-b2c31660be917ea6d59cd54e6f650b06b5e812ed.tar.bz2 |
Extract profiling code from [re]allocation functions.
Extract profiling code from malloc(), imemalign(), calloc(), realloc(),
mallocx(), rallocx(), and xallocx(). This slightly reduces the amount
of code compiled into the fast paths, but the primary benefit is the
combinatorial complexity reduction.
Simplify iralloc[t]() by creating a separate ixalloc() that handles the
no-move cases.
Further simplify [mrxn]allocx() (and by implication [mrn]allocm()) to
make request size overflows due to size class and/or alignment
constraints trigger undefined behavior (detected by debug-only
assertions).
Report ENOMEM rather than EINVAL if an OOM occurs during heap profiling
backtrace creation in imemalign(). This bug impacted posix_memalign()
and aligned_alloc().
Diffstat (limited to 'src/arena.c')
-rw-r--r-- | src/arena.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/src/arena.c b/src/arena.c index 536be29..ca5b4fe 100644 --- a/src/arena.c +++ b/src/arena.c @@ -2061,7 +2061,7 @@ arena_ralloc_large(void *ptr, size_t oldsize, size_t size, size_t extra, } } -void * +bool arena_ralloc_no_move(void *ptr, size_t oldsize, size_t size, size_t extra, bool zero) { @@ -2077,19 +2077,19 @@ arena_ralloc_no_move(void *ptr, size_t oldsize, size_t size, size_t extra, SMALL_SIZE2BIN(size + extra) == SMALL_SIZE2BIN(oldsize)) || (size <= oldsize && size + extra >= oldsize)) - return (ptr); + return (false); } else { assert(size <= arena_maxclass); if (size + extra > SMALL_MAXCLASS) { if (arena_ralloc_large(ptr, oldsize, size, extra, zero) == false) - return (ptr); + return (false); } } } /* Reallocation would require a move. */ - return (NULL); + return (true); } void * @@ -2101,9 +2101,8 @@ arena_ralloc(arena_t *arena, void *ptr, size_t oldsize, size_t size, size_t copysize; /* Try to avoid moving the allocation. */ - ret = arena_ralloc_no_move(ptr, oldsize, size, extra, zero); - if (ret != NULL) - return (ret); + if (arena_ralloc_no_move(ptr, oldsize, size, extra, zero) == false) + return (ptr); /* * size and oldsize are different enough that we need to move the |