Skip to content

Commit 650cc93

Browse files
gbaraldid-netto
authored andcommitted
Implement realloc accounting correctly (JuliaLang#51027)
This was potentially making us getting wrong results.
1 parent 902dcb4 commit 650cc93

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

38213821
int64_t diff = sz - old;
38223822
if (diff < 0) {
3823+
diff = -diff;
38233824
uint64_t free_acc = jl_atomic_load_relaxed(&ptls->gc_num.free_acc);
38243825
if (free_acc + diff < 16*1024)
3825-
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + (-diff));
3826+
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + diff);
38263827
else {
3827-
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + (-diff)));
3828+
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + diff));
38283829
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, 0);
38293830
}
38303831
}
@@ -3956,11 +3957,12 @@ static void *gc_managed_realloc_(jl_ptls_t ptls, void *d, size_t sz, size_t olds
39563957

39573958
int64_t diff = allocsz - oldsz;
39583959
if (diff < 0) {
3960+
diff = -diff;
39593961
uint64_t free_acc = jl_atomic_load_relaxed(&ptls->gc_num.free_acc);
39603962
if (free_acc + diff < 16*1024)
3961-
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + (-diff));
3963+
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, free_acc + diff);
39623964
else {
3963-
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + (-diff)));
3965+
jl_atomic_fetch_add_relaxed(&gc_heap_stats.heap_size, -(free_acc + diff));
39643966
jl_atomic_store_relaxed(&ptls->gc_num.free_acc, 0);
39653967
}
39663968
}

0 commit comments

Comments
 (0)