diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c index 22ec5ddf2a2..1a782f6cd97 100644 --- a/Modules/_tracemalloc.c +++ b/Modules/_tracemalloc.c @@ -563,20 +563,27 @@ tracemalloc_realloc(void *ctx, void *ptr, size_t new_size, int gil_held) ptr2 = alloc->realloc(alloc->ctx, ptr, new_size); if (ptr2 != NULL) { - if (ptr != NULL) + if (ptr != NULL) { + /* resize */ tracemalloc_log_free(ptr); - if (tracemalloc_log_alloc(ptr2, new_size) < 0) { - if (ptr == NULL) { + if (tracemalloc_log_alloc(ptr2, new_size) < 0) { + /* Memory allocation failed. The error cannot be reported to + the caller, because realloc() may already have shrinked the + memory block and so removed bytes. + + This case is very unlikely since we just released an hash + entry, so we have enough free bytes to allocate the new + entry. */ + } + } + else { + /* new allocation */ + if (tracemalloc_log_alloc(ptr2, new_size) < 0) { /* Memory allocation failed */ alloc->free(alloc->ctx, ptr2); ptr2 = NULL; } - else { - /* Memory allocation failed. The error cannot be reported to - the caller, because realloc() may already have shrinked the - memory block and so removed bytes. */ - } } } set_reentrant(0);