aboutsummaryrefslogtreecommitdiffstats
path: root/vm_trace.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-12-19 06:38:58 +0900
committerKoichi Sasada <ko1@atdot.net>2020-12-22 00:03:00 +0900
commita2950369bd8a5866092f6badf59b0811653a6092 (patch)
treeb8933f0f3f87618c04290e420222daef3a63e68d /vm_trace.c
parentc7a5cc2c3098ea74343a0dbab36b3a65bc7a4144 (diff)
downloadruby-a2950369bd8a5866092f6badf59b0811653a6092.tar.gz
TracePoint.new(&block) should be ractor-local
TracePoint should be ractor-local because the Proc can violate the Ractor-safe.
Diffstat (limited to 'vm_trace.c')
-rw-r--r--vm_trace.c18
1 files changed, 11 insertions, 7 deletions
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;