Avoid unnecessary writes to ISEQ during GC

On mark we check whether a callcache has been invalidated and if it has
we replace it with the empty callcache, rb_vm_empty_cc(). However we
also consider the empty callcache to not be active, and so previously
would overwrite it with itself.

These additional writes are problematic because they may force
Copy-on-Write to occur on the memory page, increasing system memory use.
This commit is contained in:
John Hawthorn 2024-06-02 23:39:36 -07:00 коммит произвёл Daniel Colson
Родитель dedf5b0480
Коммит dfd29cab1f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 88A364BBE77B1353
1 изменённых файлов: 1 добавлений и 1 удалений

2
iseq.c
Просмотреть файл

@ -344,7 +344,7 @@ rb_iseq_mark_and_move(rb_iseq_t *iseq, bool reference_updating)
if (cc_is_active(cds[i].cc, reference_updating)) {
rb_gc_mark_and_move_ptr(&cds[i].cc);
}
else {
else if (cds[i].cc != rb_vm_empty_cc()) {
cds[i].cc = rb_vm_empty_cc();
}
}