@@ -74,10 +74,21 @@ ex_callback(uint32_t e, struct gvl_hook_event_args args) {
7474 fprintf (stderr , "calling callback\n" );
7575}
7676
77+ static gvl_hook_t * single_hook = NULL ;
78+
7779static VALUE
7880thread_register_gvl_callback (VALUE thread ) {
79- rb_gvl_event_new (* ex_callback , 0x12 );
81+ single_hook = rb_gvl_event_new (* ex_callback , 0x12 );
82+
83+ return Qnil ;
84+ }
8085
86+ static VALUE
87+ thread_unregister_gvl_callback (VALUE thread ) {
88+ if (single_hook ) {
89+ rb_gvl_event_delete (single_hook );
90+ single_hook = NULL ;
91+ }
8192
8293 return Qnil ;
8394}
@@ -88,6 +99,21 @@ thread_call_gvl_callback(VALUE thread) {
8899 return Qnil ;
89100}
90101
102+ static VALUE
103+ thread_register_and_unregister_gvl_callback (VALUE thread ) {
104+ gvl_hook_t * hooks [5 ];
105+ for (int i = 0 ; i < 5 ; i ++ ) {
106+ hooks [i ] = rb_gvl_event_new (* ex_callback , 0x12 );
107+ }
108+
109+ if (!rb_gvl_event_delete (hooks [4 ])) return Qfalse ;
110+ if (!rb_gvl_event_delete (hooks [0 ])) return Qfalse ;
111+ if (!rb_gvl_event_delete (hooks [3 ])) return Qfalse ;
112+ if (!rb_gvl_event_delete (hooks [2 ])) return Qfalse ;
113+ if (!rb_gvl_event_delete (hooks [1 ])) return Qfalse ;
114+ return Qtrue ;
115+ }
116+
91117void
92118Init_call_without_gvl (void )
93119{
@@ -96,5 +122,8 @@ Init_call_without_gvl(void)
96122 rb_define_singleton_method (klass , "runnable_sleep" , thread_runnable_sleep , 1 );
97123 rb_define_singleton_method (klass , "ubf_async_safe" , thread_ubf_async_safe , 1 );
98124 rb_define_singleton_method (klass , "register_callback" , thread_register_gvl_callback , 0 );
125+ rb_define_singleton_method (klass , "unregister_callback" , thread_unregister_gvl_callback , 0 );
126+ rb_define_singleton_method (klass , "register_and_unregister_callbacks" , thread_register_and_unregister_gvl_callback , 0 );
99127 rb_define_singleton_method (klass , "call_callbacks" , thread_call_gvl_callback , 0 );
128+
100129}
0 commit comments