8000 Refactor `id_to_obj_tbl` compaction · ruby/ruby@cf9046c · GitHub
[go: up one dir, main page]

Skip to content

Commit cf9046c

Browse files
byrootpeterzhu2118
andcommitted
Refactor id_to_obj_tbl compaction
Use `st_foreach_with_replace` rather than to call `st_insert` from inside `st_foreach`, this saves from having to disable GC. Co-Authored-By: Peter Zhu <peter@peterzhu.ca>
1 parent 2d1241b commit cf9046c

File tree

1 file changed

+12
-59
lines changed

1 file changed

+12
-59
lines changed

gc.c

Lines changed: 12 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3660,70 +3660,30 @@ vm_weak_table_gen_fields_foreach_too_complex_replace_i(st_data_t *_key, st_data_
36603660
struct st_table *rb_generic_fields_tbl_get(void);
36613661

36623662
static int
3663-
vm_weak_table_id_to_obj_foreach(st_data_t key, st_data_t value, st_data_t data)
3663+
vm_weak_table_id_to_obj_foreach(st_data_t key, st_data_t value, st_data_t data, int error)
36643664
{
36653665
struct global_vm_table_foreach_data *iter_data = (struct global_vm_table_foreach_data *)data;
36663666

3667-
int ret = iter_data->callback((VALUE)value, iter_data->data);
3668-
3669-
switch (ret) {
3670-
case ST_CONTINUE:
3671-
return ret;
3672-
3673-
case ST_DELETE:
3674-
GC_ASSERT(rb_shape_obj_has_id((VALUE)value));
3675-
return ST_DELETE;
3676-
3677-
case ST_REPLACE: {
3678-
VALUE new_value = (VALUE)value;
3679-
ret = iter_data->update_callback(&new_value, iter_data->data);
3680-
if (value != new_value) {
3681-
DURING_GC_COULD_MALLOC_REGION_START();
3682-
{
3683-
st_insert(id_to_obj_tbl, key, (st_data_t)new_value);
3684-
}
3685-
DURING_GC_COULD_MALLOC_REGION_END();
3686-
}
3687-
return ST_CONTINUE;
3688-
}
3667+
if (!iter_data->weak_only && !FIXNUM_P((VALUE)key)) {
3668+
int ret = iter_data->callback((VALUE)key, iter_data->data);
3669+
if (ret != ST_CONTINUE) return ret;
36893670
}
36903671

3691-
return ret;
3672+
return iter_data->callback((VALUE)value, iter_data->data);
36923673
}
36933674

36943675
static int
3695-
vm_weak_table_id_to_obj_keys_foreach(st_data_t key, st_data_t value, st_data_t data)
3676+
vm_weak_table_id_to_obj_foreach_update(st_data_t *key, st_data_t *value, st_data_t data, int existing)
36963677
{
36973678
struct global_vm_table_foreach_data *iter_data = (struct global_vm_table_foreach_data *)data;
36983679

3699-
if (LIKELY(FIXNUM_P((VALUE)key))) {
3700-
return ST_CONTINUE;
3701-
}
3702-
3703-
int ret = iter_data->callback((VALUE)key, iter_data->data);
3704-
3705-
switch (ret) {
3706-
case ST_CONTINUE:
3707-
return ret;
3708-
3709-
case ST_DELETE:
3710-
return ST_DELETE;
3680+
iter_data->update_callback((VALUE *)value, iter_data->data);
37113681

3712-
case ST_REPLACE: {
3713-
VALUE new_key = (VALUE)key;
3714-
ret = iter_data->update_callback(&new_key, iter_data->data);
3715-
if (key != new_key) ret = ST_DELETE;
3716-
DURING_GC_COULD_MALLOC_REGION_START();
3717-
{
3718-
st_insert(id_to_obj_tbl, (st_data_t)new_key, value);
3719-
}
3720-
DURING_GC_COULD_MALLOC_REGION_END();
3721-
key = (st_data_t)new_key;
3722-
break;
3723-
}
3682+
if (!iter_data->weak_only && !FIXNUM_P((VALUE)*key)) {
3683+
iter_data->update_callback((VALUE *)key, iter_data->data);
37243684
}
37253685

3726-
return ret;
3686+
return ST_CONTINUE;
37273687
}
37283688

37293689
static int
@@ -3855,19 +3815,12 @@ rb_gc_vm_weak_table_foreach(vm_table_foreach_callback_func callback,
38553815
}
38563816
case RB_GC_VM_ID_TO_OBJ_TABLE: {
38573817
if (id_to_obj_tbl) {
3858-
st_foreach(
3818+
st_foreach_with_replace(
38593819
id_to_obj_tbl,
38603820
vm_weak_table_id_to_obj_foreach,
3821+
vm_weak_table_id_to_obj_foreach_update,
38613822
(st_data_t)&foreach_data
38623823
);
3863-
3864-
if (!RB_POSFIXABLE(next_object_id)) {
3865-
st_foreach(
3866-
id_to_obj_tbl,
3867-
vm_weak_table_id_to_obj_keys_foreach,
3868-
(st_data_t)&foreach_data
3869-
);
3870-
}
38713824
}
38723825
break;
38733826
}

0 commit comments

Comments
 (0)
0