Skip to content

Commit

Permalink
Make global_cc_cache_table per-ractor
Browse files Browse the repository at this point in the history
  • Loading branch information
rm155 committed Oct 24, 2022
1 parent 08aa9d1 commit 345b29e
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 5 deletions.
17 changes: 17 additions & 0 deletions gc.c
Expand Up @@ -875,6 +875,8 @@ typedef struct rb_objspace {
VALUE stress_to_class;
#endif

const struct rb_callcache *global_cc_cache_table[VM_GLOBAL_CC_CACHE_TABLE_SIZE]; // vm_eval.c

rb_ractor_t *ractor;
struct ccan_list_node objspace_node;

Expand Down Expand Up @@ -1095,6 +1097,21 @@ gc_mode_verify(enum gc_mode mode)
return mode;
}

const struct rb_callcache *
get_from_global_cc_cache_table(int index)
{
rb_objspace_t *objspace = &rb_objspace;
return objspace->global_cc_cache_table[index];
}

void
set_in_global_cc_cache_table(int index, const struct rb_callcache *cc)
{
rb_objspace_t *objspace = &rb_objspace;
objspace->global_cc_cache_table[index] = cc;
}


static inline bool
has_sweeping_pages(rb_objspace_t *objspace)
{
Expand Down
3 changes: 3 additions & 0 deletions gc.h
Expand Up @@ -114,6 +114,9 @@ int ruby_get_stack_grow_direction(volatile VALUE *addr);
const char *rb_obj_info(VALUE obj);
const char *rb_raw_obj_info(char *const buff, const size_t buff_size, VALUE obj);

const struct rb_callcache *get_from_global_cc_cache_table(int index);
void set_in_global_cc_cache_table(int index, const struct rb_callcache *cc);

void rb_add_to_shareable_tbl(VALUE obj);
void rb_add_to_end_proc_list(VALUE *addr);
VALUE rb_gc_ractor_teardown_cleanup();
Expand Down
4 changes: 2 additions & 2 deletions vm.c
Expand Up @@ -2834,14 +2834,14 @@ rb_vm_mark(void *ptr)
rb_id_table_foreach_values(vm->negative_cme_table, vm_mark_negative_cme, NULL);
rb_mark_tbl_no_pin(vm->overloaded_cme_table);
for (i=0; i<VM_GLOBAL_CC_CACHE_TABLE_SIZE; i++) {
const struct rb_callcache *cc = vm->global_cc_cache_table[i];
const struct rb_callcache *cc = get_from_global_cc_cache_table(i);

if (cc != NULL) {
if (!vm_cc_invalidated_p(cc)) {
rb_gc_mark((VALUE)cc);
}
else {
vm->global_cc_cache_table[i] = NULL;
set_in_global_cc_cache_table(i, NULL);
}
}
}
Expand Down
1 change: 0 additions & 1 deletion vm_core.h
Expand Up @@ -759,7 +759,6 @@ typedef struct rb_vm_struct {
#ifndef VM_GLOBAL_CC_CACHE_TABLE_SIZE
#define VM_GLOBAL_CC_CACHE_TABLE_SIZE 1023
#endif
const struct rb_callcache *global_cc_cache_table[VM_GLOBAL_CC_CACHE_TABLE_SIZE]; // vm_eval.c

#if defined(USE_VM_CLOCK) && USE_VM_CLOCK
uint32_t clock;
Expand Down
5 changes: 3 additions & 2 deletions vm_eval.c
Expand Up @@ -441,7 +441,8 @@ gccct_method_search_slowpath(rb_vm_t *vm, VALUE klass, ID mid, int argc, unsigne
cc = NULL;
}

return vm->global_cc_cache_table[index] = cc;
set_in_global_cc_cache_table(index, cc);
return cc;
}

static inline const struct rb_callcache *
Expand All @@ -460,7 +461,7 @@ gccct_method_search(rb_execution_context_t *ec, VALUE recv, ID mid, int argc)
// search global method cache
unsigned int index = (unsigned int)(gccct_hash(klass, mid) % VM_GLOBAL_CC_CACHE_TABLE_SIZE);
rb_vm_t *vm = rb_ec_vm_ptr(ec);
const struct rb_callcache *cc = vm->global_cc_cache_table[index];
const struct rb_callcache *cc = get_from_global_cc_cache_table(index);

if (LIKELY(cc)) {
if (LIKELY(vm_cc_class_check(cc, klass))) {
Expand Down

0 comments on commit 345b29e

Please sign in to comment.