@@ -74,10 +74,21 @@ ex_callback(uint32_t e, struct gvl_hook_event_args args) {
74
74
fprintf (stderr , "calling callback\n" );
75
75
}
76
76
77
+ static gvl_hook_t * single_hook = NULL ;
78
+
77
79
static VALUE
78
80
thread_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
+ }
80
85
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
+ }
81
92
82
93
return Qnil ;
83
94
}
@@ -88,6 +99,21 @@ thread_call_gvl_callback(VALUE thread) {
88
99
return Qnil ;
89
100
}
90
101
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
+
91
117
void
92
118
Init_call_without_gvl (void )
93
119
{
@@ -96,5 +122,8 @@ Init_call_without_gvl(void)
96
122
rb_define_singleton_method (klass , "runnable_sleep" , thread_runnable_sleep , 1 );
97
123
rb_define_singleton_method (klass , "ubf_async_safe" , thread_ubf_async_safe , 1 );
98
124
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 );
99
127
rb_define_singleton_method (klass , "call_callbacks" , thread_call_gvl_callback , 0 );
128
+
100
129
}
0 commit comments