Skip to content

Commit 823d55a

Browse files
committed
Add lock-free fastpath to callable_method_entry...
1 parent 2c6363c commit 823d55a

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

vm_method.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1822,6 +1822,25 @@ callable_method_entry_or_negative(VALUE klass, ID mid, VALUE *defined_class_ptr)
18221822
const rb_callable_method_entry_t *cme;
18231823

18241824
VM_ASSERT_TYPE2(klass, T_CLASS, T_ICLASS);
1825+
1826+
/* Fast path: lock-free read from cache */
1827+
VALUE cc_tbl = RUBY_ATOMIC_VALUE_LOAD(RCLASS_WRITABLE_CC_TBL(klass));
1828+
if (cc_tbl) {
1829+
VALUE ccs_data;
1830+
if (rb_managed_id_table_lookup(cc_tbl, mid, &ccs_data)) {
1831+
struct rb_class_cc_entries *ccs = (struct rb_class_cc_entries *)ccs_data;
1832+
VM_ASSERT(vm_ccs_p(ccs));
1833+
1834+
if (LIKELY(!METHOD_ENTRY_INVALIDATED(ccs->cme))) {
1835+
VM_ASSERT(ccs->cme->called_id == mid);
1836+
if (defined_class_ptr != NULL) *defined_class_ptr = ccs->cme->defined_class;
1837+
RB_DEBUG_COUNTER_INC(ccs_found);
1838+
return ccs->cme;
1839+
}
1840+
}
1841+
}
1842+
1843+
/* Slow path: need to lock and potentially populate cache */
18251844
RB_VM_LOCKING() {
18261845
cme = cached_callable_method_entry(klass, mid);
18271846

0 commit comments

Comments
 (0)