static VALUE rb_disable_method_trace_for_thread(VALUE self) { VALUE current_thread; VALUE thread_variables_hash; VALUE trace_set; ID locals_id; ID eval_trace_thread_id; VALUE eval_trace_thread_flag; CONST_ID(locals_id, "locals"); CONST_ID(eval_trace_thread_id, "gcloud_eval_trace_set"); eval_trace_thread_flag = ID2SYM(eval_trace_thread_id); current_thread = rb_thread_current(); thread_variables_hash = rb_ivar_get(current_thread, locals_id); trace_set = rb_hash_aref(thread_variables_hash, eval_trace_thread_flag); if (RTEST(trace_set)) { rb_thread_remove_event_hook(current_thread, (rb_event_hook_func_t)eval_trace_callback); rb_hash_aset(thread_variables_hash, eval_trace_thread_flag, Qfalse); } return Qnil; }
/** * disable_return_trace_for_thread * Turn off return events trace hook for a given thread. If no thread is given, it * turns off line event trace hook in current thread. It only takes action if * the thread has a thread variable "gcloud_return_trace_set" that's true. */ static VALUE disable_return_trace_for_thread(VALUE thread) { VALUE thread_variables_hash; VALUE return_trace_set; ID locals_id; ID return_trace_thread_id; VALUE return_trace_thread_flag; CONST_ID(locals_id, "locals"); CONST_ID(return_trace_thread_id, "gcloud_return_trace_set"); return_trace_thread_flag = ID2SYM(return_trace_thread_id); if (!RTEST(thread)) { thread = rb_thread_current(); } thread_variables_hash = rb_ivar_get(thread, locals_id); return_trace_set = rb_hash_aref(thread_variables_hash, return_trace_thread_flag); if (RTEST(return_trace_set)) { rb_thread_remove_event_hook(thread, (rb_event_hook_func_t)return_trace_callback); rb_hash_aset(thread_variables_hash, return_trace_thread_flag, Qfalse); } return Qnil; }
static VALUE cb_unset_tracer(VALUE self) { if(rb_iv_get(self, "@tracer_set")) { rb_thread_remove_event_hook(rb_thread_current(), trace_line_handler_ext); rb_iv_set(self, "@tracer_set", Qfalse); } return Qnil; }