aboutsummaryrefslogtreecommitdiffstats
path: root/vm_trace.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2023-11-21 16:33:19 -0500
committerPeter Zhu <peter@peterzhu.ca>2023-11-22 08:38:36 -0500
commit0f24ecf17ae43a9c2501d0f3e5b2a6d829fcdd7f (patch)
tree09ef50383d505d90be444b36a5e0fc64fb4fcaf0 /vm_trace.c
parent6d5aa796976d9c76d5416f78377fd26f2835ae94 (diff)
downloadruby-0f24ecf17ae43a9c2501d0f3e5b2a6d829fcdd7f.tar.gz
Implement Write Barriers on TracePoint
Diffstat (limited to 'vm_trace.c')
-rw-r--r--vm_trace.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/vm_trace.c b/vm_trace.c
index 3e11131bdd..eb81bf8bf7 100644
--- a/vm_trace.c
+++ b/vm_trace.c
@@ -788,7 +788,7 @@ tp_memsize(const void *ptr)
static const rb_data_type_t tp_data_type = {
"tracepoint",
{tp_mark, RUBY_TYPED_DEFAULT_FREE, tp_memsize,},
- 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
};
static VALUE
@@ -1244,7 +1244,7 @@ rb_tracepoint_enable_for_target(VALUE tpval, VALUE target, VALUE target_line)
}
VM_ASSERT(tp->local_target_set == Qfalse);
- tp->local_target_set = rb_obj_hide(rb_ident_hash_new());
+ RB_OBJ_WRITE(tpval, &tp->local_target_set, rb_obj_hide(rb_ident_hash_new()));
/* bmethod */
if (rb_obj_is_method(target)) {
@@ -1315,7 +1315,7 @@ rb_tracepoint_disable(VALUE tpval)
if (tp->local_target_set) {
rb_hash_foreach(tp->local_target_set, disable_local_event_iseq_i, tpval);
- tp->local_target_set = Qfalse;
+ RB_OBJ_WRITE(tpval, &tp->local_target_set, Qfalse);
ruby_vm_event_local_num--;
}
else {
@@ -1382,6 +1382,9 @@ tracepoint_enable_m(rb_execution_context_t *ec, VALUE tpval, VALUE target, VALUE
rb_raise(rb_eArgError, "can not override target_thread filter");
}
tp->target_th = rb_thread_ptr(target_thread);
+
+ RUBY_ASSERT(tp->target_th->self == target_thread);
+ RB_OBJ_WRITTEN(tpval, Qundef, target_thread);
}
else {
tp->target_th = NULL;
@@ -1449,7 +1452,7 @@ tracepoint_new(VALUE klass, rb_thread_t *target_th, rb_event_flag_t events, void
rb_tp_t *tp;
TypedData_Get_Struct(tpval, rb_tp_t, &tp_data_type, tp);
- tp->proc = proc;
+ RB_OBJ_WRITE(tpval, &tp->proc, proc);
tp->ractor = rb_ractor_shareable_p(proc) ? NULL : GET_RACTOR();
tp->func = func;
tp->data = data;