realloc uses remap automatically after remap_threshold

This commit is contained in:
daanx 2023-05-02 18:25:47 -07:00
parent ac21489ce7
commit 8fffc92e15
9 changed files with 180 additions and 42 deletions

View file

@ -19,12 +19,13 @@ static void negative_stat(void);
static void alloc_huge(void);
static void test_heap_walk(void);
static void test_remap(void);
static void test_remap_realloc(void);
int main() {
mi_version();
mi_stats_reset();
test_remap();
test_remap_realloc();
// detect double frees and heap corruption
// double_free1();
@ -221,18 +222,19 @@ static void test_heap_walk(void) {
static void test_remap(void) {
const size_t iterN = 100;
const size_t size0 = 64 * 1024 * 1024;
const size_t inc = 1024 * 1024;
size_t size = size0;
uint8_t* p = (uint8_t*)mi_malloc_remappable(size);
memset(p, 1, size);
for (int i = 2; i < 100; i++) {
p = mi_remap(p, size + inc);
for (int i = 2; i < iterN; i++) {
p = mi_realloc(p, size + inc);
memset(p + size, i, inc);
size += inc;
printf("%3d: increased to size %zu\n", i, size);
}
for (int i = 1; i < 100; i++) {
for (int i = 1; i < iterN; i++) {
size_t idx = size0 + ((i - 1) * inc) - 1;
uint8_t v = p[idx];
if (v != i) {
@ -243,6 +245,31 @@ static void test_remap(void) {
mi_free(p);
}
static void test_remap_realloc(void) {
const size_t iterN = 100;
const size_t size0 = 64 * 1024 * 1024;
const size_t inc = 1024 * 1024;
size_t size = size0;
uint8_t* p = (uint8_t*)mi_malloc(size);
memset(p, 1, size);
for (int i = 2; i < iterN; i++) {
p = mi_realloc(p, size + inc);
memset(p + size, i, inc);
size += inc;
printf("%3d: increased to size %zu\n", i, size);
}
for (int i = 1; i < iterN; i++) {
size_t idx = size0 + ((i - 1) * inc) - 1;
uint8_t v = p[idx];
if (v != i) {
printf("error: corrupted memory in remap_realloc: i=%d, index=0x%zx, value=%u \n", i, idx, v);
abort();
};
}
mi_free(p);
}
// ----------------------------
// bin size experiments
// ------------------------------