Skip to content

Commit e5e9142

Browse files
gbaraldiKristofferC
authored andcommitted
Implement realloc accounting correctly (#51027)
This was potentially making us getting wrong results. (cherry picked from commit ce8acdd)
1 parent 4545f0b commit e5e9142

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

src/gc.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3711,11 +3711,12 @@ JL_DLLEXPORT void *jl_gc_counted_realloc_with_old_size(void *p, size_t old, size
37113711

37123712
int64_t diff = sz - old;
37133713
if (diff < 0) {
3714+
diff = -diff;
37143715
uint64_t free_acc = jl_atomic_load_relaxed(&ptls->gc_num.free_acc);
37153716
if (free_acc + diff < 16*1024)
3716-
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + (-diff));
3717+
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + diff);
37173718
else {
3718-
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + (-diff)));
3719+
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + diff));
37193720
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, 0);
37203721
}
37213722
}
@@ -3847,11 +3848,12 @@ static void *gc_managed_realloc_(jl_ptls_t ptls, void *d, size_t sz, size_t olds
38473848

38483849
int64_t diff = allocsz - oldsz;
38493850
if (diff < 0) {
3851+
diff = -diff;
38503852
uint64_t free_acc = jl_atomic_load_relaxed(&ptls->gc_num.free_acc);
38513853
if (free_acc + diff < 16*1024)
3852-
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + (-diff));
3854+
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + diff);
38533855
else {
3854-
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + (-diff)));
3856+
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + diff));
38553857
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, 0);
38563858
}
38573859
}

0 commit comments

Comments
 (0)