From a2950369bd8a5866092f6badf59b0811653a6092 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Sat, 19 Dec 2020 06:38:58 +0900 Subject: TracePoint.new(&block) should be ractor-local TracePoint should be ractor-local because the Proc can violate the Ractor-safe. --- vm_trace.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'vm_trace.c') diff --git a/vm_trace.c b/vm_trace.c index 50cdf5fcde..3835b18ae8 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -29,6 +29,7 @@ #include "mjit.h" #include "ruby/debug.h" #include "vm_core.h" +#include "ruby/ractor.h" #include "builtin.h" @@ -136,7 +137,7 @@ hook_list_connect(VALUE list_owner, rb_hook_list_t *list, rb_event_hook_t *hook, static void connect_event_hook(const rb_execution_context_t *ec, rb_event_hook_t *hook) { - rb_hook_list_t *list = rb_vm_global_hooks(ec); + rb_hook_list_t *list = rb_ec_ractor_hooks(ec); hook_list_connect(Qundef, list, hook, TRUE); } @@ -195,7 +196,7 @@ clean_hooks(const rb_execution_context_t *ec, rb_hook_list_t *list) } } - if (list == rb_vm_global_hooks(ec)) { + if (list == rb_ec_ractor_hooks(ec)) { /* global events */ update_global_event_hook(list->events); } @@ -220,8 +221,7 @@ clean_hooks_check(const rb_execution_context_t *ec, rb_hook_list_t *list) static int remove_event_hook(const rb_execution_context_t *ec, const rb_thread_t *filter_th, rb_event_hook_func_t func, VALUE data) { - rb_vm_t *vm = rb_ec_vm_ptr(ec); - rb_hook_list_t *list = &vm->global_hooks; + rb_hook_list_t *list = rb_ec_ractor_hooks(ec); int ret = 0; rb_event_hook_t *hook = list->hooks; @@ -374,7 +374,7 @@ rb_exec_event_hooks(rb_trace_arg_t *trace_arg, rb_hook_list_t *hooks, int pop_p) ec->trace_arg = trace_arg; /* only global hooks */ - exec_hooks_unprotected(ec, rb_vm_global_hooks(ec), trace_arg); + exec_hooks_unprotected(ec, rb_ec_ractor_hooks(ec), trace_arg); ec->trace_arg = prev_trace_arg; } } @@ -708,6 +708,7 @@ typedef struct rb_tp_struct { void (*func)(VALUE tpval, void *data); void *data; VALUE proc; + rb_ractor_t *ractor; VALUE self; } rb_tp_t; @@ -1113,7 +1114,9 @@ tp_call_trace(VALUE tpval, rb_trace_arg_t *trace_arg) (*tp->func)(tpval, tp->data); } else { - rb_proc_call_with_block((VALUE)tp->proc, 1, &tpval, Qnil); + if (tp->ractor == NULL || tp->ractor == GET_RACTOR()) { + rb_proc_call_with_block((VALUE)tp->proc, 1, &tpval, Qnil); + } } } @@ -1360,6 +1363,7 @@ tracepoint_new(VALUE klass, rb_thread_t *target_th, rb_event_flag_t events, void TypedData_Get_Struct(tpval, rb_tp_t, &tp_data_type, tp); tp->proc = proc; + tp->ractor = rb_ractor_shareable_p(proc) ? NULL : GET_RACTOR(); tp->func = func; tp->data = data; tp->events = events; @@ -1513,7 +1517,7 @@ tracepoint_stat_s(rb_execution_context_t *ec, VALUE self) rb_vm_t *vm = GET_VM(); VALUE stat = rb_hash_new(); - tracepoint_stat_event_hooks(stat, vm->self, vm->global_hooks.hooks); + tracepoint_stat_event_hooks(stat, vm->self, rb_ec_ractor_hooks(ec)->hooks); /* TODO: thread local hooks */ return stat; -- cgit v1.2.3