Skip to content

Commit 6d19ead

Browse files
peterzhu2118byroot
andcommitted
Sync "Move object_id in attributes"
From: ruby/ruby#13159 Co-Authored-By: Jean Boussier <jean.boussier@gmail.com>
1 parent b7b6389 commit 6d19ead

6 files changed

Lines changed: 11 additions & 165 deletions

File tree

gc/gc.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ enum rb_gc_vm_weak_tables {
2828
RB_GC_VM_CI_TABLE,
2929
RB_GC_VM_OVERLOADED_CME_TABLE,
3030
RB_GC_VM_GLOBAL_SYMBOLS_TABLE,
31-
RB_GC_VM_GENERIC_IV_TABLE,
31+
RB_GC_VM_ID_TO_OBJ_TABLE,
32+
RB_GC_VM_GENERIC_FIELDS_TABLE,
3233
RB_GC_VM_FROZEN_STRINGS_TABLE,
3334
RB_GC_VM_WEAK_TABLE_COUNT
3435
};
@@ -70,6 +71,7 @@ size_t rb_obj_memsize_of(VALUE obj);
7071
void rb_gc_prepare_heap_process_object(VALUE obj);
7172
bool ruby_free_at_exit_p(void);
7273
bool rb_memerror_reentered(void);
74+
bool rb_obj_id_p(VALUE);
7375

7476
#if USE_MODULAR_GC
7577
bool rb_gc_event_hook_required_p(rb_event_flag_t event);

gc/gc_impl.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,6 @@ GC_IMPL_FN VALUE rb_gc_impl_define_finalizer(void *objspace_ptr, VALUE obj, VALU
100100
GC_IMPL_FN void rb_gc_impl_undefine_finalizer(void *objspace_ptr, VALUE obj);
101101
GC_IMPL_FN void rb_gc_impl_copy_finalizer(void *objspace_ptr, VALUE dest, VALUE obj);
102102
GC_IMPL_FN void rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr);
103-
// Object ID
104-
GC_IMPL_FN VALUE rb_gc_impl_object_id(void *objspace_ptr, VALUE obj);
105-
GC_IMPL_FN VALUE rb_gc_impl_object_id_to_ref(void *objspace_ptr, VALUE object_id);
106103
// Forking
107104
GC_IMPL_FN void rb_gc_impl_before_fork(void *objspace_ptr);
108105
GC_IMPL_FN void rb_gc_impl_after_fork(void *objspace_ptr, rb_pid_t pid);

gc/mmtk/mmtk.c

Lines changed: 1 addition & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@ struct objspace {
2424
size_t total_gc_time;
2525
size_t total_allocated_objects;
2626

27-
st_table *id_to_obj_tbl;
28-
st_table *obj_to_id_tbl;
29-
unsigned long long next_object_id;
30-
3127
st_table *finalizer_table;
3228
struct MMTk_final_job *finalizer_jobs;
3329
rb_postponed_job_handle_t finalizer_postponed_job;
@@ -227,8 +223,6 @@ rb_mmtk_scan_objspace(void)
227223
st_foreach(objspace->finalizer_table, pin_value, (st_data_t)objspace);
228224
}
229225

230-
st_foreach(objspace->obj_to_id_tbl, gc_mark_tbl_no_pin_i, (st_data_t)objspace);
231-
232226
struct MMTk_final_job *job = objspace->finalizer_jobs;
233227
while (job != NULL) {
234228
switch (job->kind) {
@@ -336,41 +330,6 @@ rb_mmtk_update_table_i(VALUE val, void *data)
336330
return ST_CONTINUE;
337331
}
338332

339-
static int
340-
rb_mmtk_update_obj_id_tables_obj_to_id_i(st_data_t key, st_data_t val, st_data_t data)
341-
{
342-
RUBY_ASSERT(RB_FL_TEST(key, FL_SEEN_OBJ_ID));
343-
344-
if (!mmtk_is_reachable((MMTk_ObjectReference)key)) {
345-
return ST_DELETE;
346-
}
347-
348-
return ST_CONTINUE;
349-
}
350-
351-
static int
352-
rb_mmtk_update_obj_id_tables_id_to_obj_i(st_data_t key, st_data_t val, st_data_t data)
353-
{
354-
RUBY_ASSERT(RB_FL_TEST(val, FL_SEEN_OBJ_ID));
355-
356-
if (!mmtk_is_reachable((MMTk_ObjectReference)val)) {
357-
return ST_DELETE;
358-
}
359-
360-
return ST_CONTINUE;
361-
}
362-
363-
static void
364-
rb_mmtk_update_obj_id_tables(void)
365-
{
366-
struct objspace *objspace = rb_gc_get_objspace();
367-
368-
st_foreach(objspace->obj_to_id_tbl, rb_mmtk_update_obj_id_tables_obj_to_id_i, 0);
369-
if (objspace->id_to_obj_tbl) {
370-
st_foreach(objspace->id_to_obj_tbl, rb_mmtk_update_obj_id_tables_id_to_obj_i, 0);
371-
}
372-
}
373-
374333
static int
375334
rb_mmtk_global_tables_count(void)
376335
{
@@ -403,7 +362,6 @@ MMTk_RubyUpcalls ruby_upcalls = {
403362
rb_mmtk_update_global_tables,
404363
rb_mmtk_global_tables_count,
405364
rb_mmtk_update_finalizer_table,
406-
rb_mmtk_update_obj_id_tables,
407365
};
408366

409367
// Use max 80% of the available memory by default for MMTk
@@ -432,7 +390,6 @@ rb_gc_impl_objspace_alloc(void)
432390
return calloc(1, sizeof(struct objspace));
433391
}
434392

435-
static void objspace_obj_id_init(struct objspace *objspace);
436393
static void gc_run_finalizers(void *data);
437394

438395
void
@@ -442,8 +399,6 @@ rb_gc_impl_objspace_init(void *objspace_ptr)
442399

443400
objspace->measure_gc_time = true;
444401

445-
objspace_obj_id_init(objspace);
446-
447402
objspace->finalizer_table = st_init_numtable();
448403
objspace->finalizer_postponed_job = rb_postponed_job_preregister(0, gc_run_finalizers, objspace);
449404

@@ -1069,111 +1024,6 @@ rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr)
10691024
gc_run_finalizers(objspace);
10701025
}
10711026

1072-
// Object ID
1073-
static int
1074-
object_id_cmp(st_data_t x, st_data_t y)
1075-
{
1076-
if (RB_TYPE_P(x, T_BIGNUM)) {
1077-
return !rb_big_eql(x, y);
1078-
}
1079-
else {
1080-
return x != y;
1081-
}
1082-
}
1083-
1084-
static st_index_t
1085-
object_id_hash(st_data_t n)
1086-
{
1087-
return FIX2LONG(rb_hash((VALUE)n));
1088-
}
1089-
1090-
#define OBJ_ID_INCREMENT (RUBY_IMMEDIATE_MASK + 1)
1091-
#define OBJ_ID_INITIAL (OBJ_ID_INCREMENT)
1092-
1093-
static const struct st_hash_type object_id_hash_type = {
1094-
object_id_cmp,
1095-
object_id_hash,
1096-
};
1097-
1098-
static void
1099-
objspace_obj_id_init(struct objspace *objspace)
1100-
{
1101-
objspace->id_to_obj_tbl = NULL;
1102-
objspace->obj_to_id_tbl = st_init_numtable();
1103-
objspace->next_object_id = OBJ_ID_INITIAL;
1104-
}
1105-
1106-
VALUE
1107-
rb_gc_impl_object_id(void *objspace_ptr, VALUE obj)
1108-
{
1109-
VALUE id;
1110-
struct objspace *objspace = objspace_ptr;
1111-
1112-
unsigned int lev = rb_gc_vm_lock();
1113-
if (FL_TEST(obj, FL_SEEN_OBJ_ID)) {
1114-
st_data_t val;
1115-
if (st_lookup(objspace->obj_to_id_tbl, (st_data_t)obj, &val)) {
1116-
id = (VALUE)val;
1117-
}
1118-
else {
1119-
rb_bug("rb_gc_impl_object_id: FL_SEEN_OBJ_ID flag set but not found in table");
1120-
}
1121-
}
1122-
else {
1123-
RUBY_ASSERT(!st_lookup(objspace->obj_to_id_tbl, (st_data_t)obj, NULL));
1124-
1125-
id = ULL2NUM(objspace->next_object_id);
1126-
objspace->next_object_id += OBJ_ID_INCREMENT;
1127-
1128-
st_insert(objspace->obj_to_id_tbl, (st_data_t)obj, (st_data_t)id);
1129-
if (RB_UNLIKELY(objspace->id_to_obj_tbl)) {
1130-
st_insert(objspace->id_to_obj_tbl, (st_data_t)id, (st_data_t)obj);
1131-
}
1132-
FL_SET(obj, FL_SEEN_OBJ_ID);
1133-
}
1134-
rb_gc_vm_unlock(lev);
1135-
1136-
return id;
1137-
}
1138-
1139-
static int
1140-
build_id_to_obj_i(st_data_t key, st_data_t value, st_data_t data)
1141-
{
1142-
st_table *id_to_obj_tbl = (st_table *)data;
1143-
st_insert(id_to_obj_tbl, value, key);
1144-
return ST_CONTINUE;
1145-
}
1146-
1147-
VALUE
1148-
rb_gc_impl_object_id_to_ref(void *objspace_ptr, VALUE object_id)
1149-
{
1150-
struct objspace *objspace = objspace_ptr;
1151-
1152-
1153-
unsigned int lev = rb_gc_vm_lock();
1154-
1155-
if (!objspace->id_to_obj_tbl) {
1156-
objspace->id_to_obj_tbl = st_init_table_with_size(&object_id_hash_type, st_table_size(objspace->obj_to_id_tbl));
1157-
st_foreach(objspace->obj_to_id_tbl, build_id_to_obj_i, (st_data_t)objspace->id_to_obj_tbl);
1158-
}
1159-
1160-
VALUE obj;
1161-
bool found = st_lookup(objspace->id_to_obj_tbl, object_id, &obj) && !rb_gc_impl_garbage_object_p(objspace, obj);
1162-
1163-
rb_gc_vm_unlock(lev);
1164-
1165-
if (found) {
1166-
return obj;
1167-
}
1168-
1169-
if (rb_funcall(object_id, rb_intern(">="), 1, ULL2NUM(objspace->next_object_id))) {
1170-
rb_raise(rb_eRangeError, "%+"PRIsVALUE" is not an id value", rb_funcall(object_id, rb_intern("to_s"), 1, INT2FIX(10)));
1171-
}
1172-
else {
1173-
rb_raise(rb_eRangeError, "%+"PRIsVALUE" is a recycled object", rb_funcall(object_id, rb_intern("to_s"), 1, INT2FIX(10)));
1174-
}
1175-
}
1176-
11771027
// Forking
11781028

11791029
void
@@ -1364,7 +1214,7 @@ rb_gc_impl_object_metadata(void *objspace_ptr, VALUE obj)
13641214
n++; \
13651215
} while (0)
13661216

1367-
if (FL_TEST(obj, FL_SEEN_OBJ_ID)) SET_ENTRY(object_id, rb_obj_id(obj));
1217+
if (rb_obj_id_p(obj)) SET_ENTRY(object_id, rb_obj_id(obj));
13681218

13691219
object_metadata_entries[n].name = 0;
13701220
object_metadata_entries[n].val = 0;

gc/mmtk/mmtk.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ typedef struct MMTk_RubyUpcalls {
6868
void (*update_global_tables)(int tbl_idx);
6969
int (*global_tables_count)(void);
7070
void (*update_finalizer_table)(void);
71-
void (*update_obj_id_tables)(void);
7271
} MMTk_RubyUpcalls;
7372

7473
typedef struct MMTk_RawVecOfObjRef {

gc/mmtk/src/abi.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub const MIN_OBJ_ALIGN: usize = 8; // Even on 32-bit machine. A Ruby object is
1010

1111
pub const GC_THREAD_KIND_WORKER: libc::c_int = 1;
1212

13-
const HAS_MOVED_GIVTBL: usize = 1 << 63;
13+
const HAS_MOVED_GFIELDSTBL: usize = 1 << 63;
1414
const HIDDEN_SIZE_MASK: usize = 0x0000FFFFFFFFFFFF;
1515

1616
// Should keep in sync with C code.
@@ -87,16 +87,16 @@ impl RubyObjectAccess {
8787
(self.load_flags() & RUBY_FL_EXIVAR) != 0
8888
}
8989

90-
pub fn has_moved_givtbl(&self) -> bool {
91-
(self.load_hidden_field() & HAS_MOVED_GIVTBL) != 0
90+
pub fn has_moved_gfields_tbl(&self) -> bool {
91+
(self.load_hidden_field() & HAS_MOVED_GFIELDSTBL) != 0
9292
}
9393

94-
pub fn set_has_moved_givtbl(&self) {
95-
self.update_hidden_field(|old| old | HAS_MOVED_GIVTBL)
94+
pub fn set_has_moved_gfields_tbl(&self) {
95+
self.update_hidden_field(|old| old | HAS_MOVED_GFIELDSTBL)
9696
}
9797

98-
pub fn clear_has_moved_givtbl(&self) {
99-
self.update_hidden_field(|old| old & !HAS_MOVED_GIVTBL)
98+
pub fn clear_has_moved_gfields_tbl(&self) {
99+
self.update_hidden_field(|old| old & !HAS_MOVED_GFIELDSTBL)
100100
}
101101

102102
pub fn prefix_size() -> usize {
@@ -322,7 +322,6 @@ pub struct RubyUpcalls {
322322
pub update_global_tables: extern "C" fn(tbl_idx: c_int),
323323
pub global_tables_count: extern "C" fn() -> c_int,
324324
pub update_finalizer_table: extern "C" fn(),
325-
pub update_obj_id_tables: extern "C" fn(),
326325
}
327326

328327
unsafe impl Sync for RubyUpcalls {}

gc/mmtk/src/weak_proc.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ struct UpdateFinalizerObjIdTables;
185185
impl GlobalTableProcessingWork for UpdateFinalizerObjIdTables {
186186
fn process_table(&mut self) {
187187
(crate::upcalls().update_finalizer_table)();
188-
(crate::upcalls().update_obj_id_tables)();
189188
}
190189
}
191190
impl GCWork<Ruby> for UpdateFinalizerObjIdTables {

0 commit comments

Comments
 (0)