mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-07-15 21:27:18 +03:00
Revert "Avoid NULL check in free() and malloc_usable_size()."
This reverts commit 96d4120ac0.
ivsalloc() depends on chunks_rtree being initialized. This can be
worked around via a NULL pointer check. However,
thread_allocated_tsd_get() also depends on initialization having
occurred, and there is no way to guard its call in free() that is
cheaper than checking whether ptr is NULL.
This commit is contained in:
parent
96d4120ac0
commit
f004737267
5 changed files with 22 additions and 37 deletions
|
|
@ -65,7 +65,7 @@ DOCS_HTML := $(DOCS_XML:@objroot@%.xml=@srcroot@%.html)
|
|||
DOCS_MAN3 := $(DOCS_XML:@objroot@%.xml=@srcroot@%.3)
|
||||
DOCS := $(DOCS_HTML) $(DOCS_MAN3)
|
||||
CTESTS := @srcroot@test/aligned_alloc.c @srcroot@test/allocated.c \
|
||||
@srcroot@test/bitmap.c @srcroot@test/mremap.c @srcroot@test/null.c \
|
||||
@srcroot@test/bitmap.c @srcroot@test/mremap.c \
|
||||
@srcroot@test/posix_memalign.c @srcroot@test/thread_arena.c \
|
||||
@srcroot@test/thread_tcache_enabled.c
|
||||
ifeq (@enable_experimental@, 1)
|
||||
|
|
|
|||
|
|
@ -633,6 +633,8 @@ isalloc(const void *ptr)
|
|||
size_t ret;
|
||||
arena_chunk_t *chunk;
|
||||
|
||||
assert(ptr != NULL);
|
||||
|
||||
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
|
||||
if (chunk != ptr) {
|
||||
/* Region. */
|
||||
|
|
@ -640,10 +642,8 @@ isalloc(const void *ptr)
|
|||
ret = arena_salloc_demote(ptr);
|
||||
else
|
||||
ret = arena_salloc(ptr);
|
||||
} else if (ptr != NULL)
|
||||
} else
|
||||
ret = huge_salloc(ptr);
|
||||
else
|
||||
ret = 0;
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
|
@ -664,10 +664,12 @@ idalloc(void *ptr)
|
|||
{
|
||||
arena_chunk_t *chunk;
|
||||
|
||||
assert(ptr != NULL);
|
||||
|
||||
chunk = (arena_chunk_t *)CHUNK_ADDR2BASE(ptr);
|
||||
if (chunk != ptr)
|
||||
arena_dalloc(chunk->arena, chunk, ptr);
|
||||
else if (ptr != NULL)
|
||||
else
|
||||
huge_dalloc(ptr, true);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1100,18 +1100,22 @@ JEMALLOC_ATTR(visibility("default"))
|
|||
void
|
||||
je_free(void *ptr)
|
||||
{
|
||||
size_t usize;
|
||||
|
||||
assert(malloc_initialized || IS_INITIALIZER);
|
||||
if (ptr != NULL) {
|
||||
size_t usize;
|
||||
|
||||
if (config_prof && opt_prof) {
|
||||
usize = isalloc(ptr);
|
||||
prof_free(ptr, usize);
|
||||
} else if (config_stats)
|
||||
usize = isalloc(ptr);
|
||||
if (config_stats)
|
||||
thread_allocated_tsd_get()->deallocated += usize;
|
||||
idalloc(ptr);
|
||||
assert(malloc_initialized || IS_INITIALIZER);
|
||||
|
||||
if (config_prof && opt_prof) {
|
||||
usize = isalloc(ptr);
|
||||
prof_free(ptr, usize);
|
||||
} else if (config_stats) {
|
||||
usize = isalloc(ptr);
|
||||
}
|
||||
if (config_stats)
|
||||
thread_allocated_tsd_get()->deallocated += usize;
|
||||
idalloc(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1196,7 +1200,7 @@ je_malloc_usable_size(const void *ptr)
|
|||
if (config_ivsalloc)
|
||||
ret = ivsalloc(ptr);
|
||||
else
|
||||
ret = isalloc(ptr);
|
||||
ret = (ptr != NULL) ? isalloc(ptr) : 0;
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
|
|
|||
19
test/null.c
19
test/null.c
|
|
@ -1,19 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#define JEMALLOC_MANGLE
|
||||
#include "jemalloc_test.h"
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
|
||||
fprintf(stderr, "Test begin\n");
|
||||
|
||||
free(malloc(1));
|
||||
free(NULL);
|
||||
assert(malloc_usable_size(NULL) == 0);
|
||||
|
||||
fprintf(stderr, "Test end\n");
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
Test begin
|
||||
Test end
|
||||
Loading…
Add table
Add a link
Reference in a new issue