Revert "Avoid NULL check in free() and malloc_usable_size()."
This reverts commit 96d4120ac08db3f2d566e8e5c3bc134a24aa0afc. 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
@ -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…
x
Reference in New Issue
Block a user