Skip to content

Commit ce8acdd

Browse files
authored
Implement realloc accounting correctly (#51027)
This was potentially making us getting wrong results.
1 parent 231ca24 commit ce8acdd

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
@@ -3728,11 +3728,12 @@ JL_DLLEXPORT void *jl_gc_counted_realloc_with_old_size(void *p, size_t old, size
37283728

37293729
int64_t diff = sz - old;
37303730
if (diff < 0) {
3731+
diff = -diff;
37313732
uint64_t free_acc = jl_atomic_load_relaxed(&ptls->gc_num.free_acc);
37323733
if (free_acc + diff < 16*1024)
3733-
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + (-diff));
3734+
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + diff);
37343735
else {
3735-
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + (-diff)));
3736+
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + diff));
37363737
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, 0);
37373738
}
37383739
}
@@ -3864,11 +3865,12 @@ static void *gc_managed_realloc_(jl_ptls_t ptls, void *d, size_t sz, size_t olds
38643865

38653866
int64_t diff = allocsz - oldsz;
38663867
if (diff < 0) {
3868+
diff = -diff;
38673869
uint64_t free_acc = jl_atomic_load_relaxed(&ptls->gc_num.free_acc);
38683870
if (free_acc + diff < 16*1024)
3869-
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + (-diff));
3871+
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + diff);
38703872
else {
3871-
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + (-diff)));
3873+
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + diff));
38723874
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, 0);
38733875
}
38743876
}

0 commit comments

Comments
 (0)