@@ -8,7 +8,6 @@ static VALUE rb_eClosedQueueError;
88/* Mutex */
99typedef struct rb_mutex_struct {
1010 rb_fiber_t * fiber ;
11- VALUE thread ; // even if the fiber is collected, we might need access to the thread in mutex_free
1211 struct rb_mutex_struct * next_mutex ;
1312 struct ccan_list_head waitq ; /* protected by GVL */
1413} rb_mutex_t ;
@@ -107,6 +106,8 @@ static const char* rb_mutex_unlock_th(rb_mutex_t *mutex, rb_thread_t *th, rb_fib
107106 *
108107 */
109108
109+ #define mutex_mark ((void(*)(void*))0)
110+
110111static size_t
111112rb_mutex_num_waiting (rb_mutex_t * mutex )
112113{
@@ -122,39 +123,13 @@ rb_mutex_num_waiting(rb_mutex_t *mutex)
122123
123124rb_thread_t * rb_fiber_threadptr (const rb_fiber_t * fiber );
124125
125- static bool
126- locked_p (rb_mutex_t * mutex )
127- {
128- return mutex -> fiber != 0 ;
129- }
130-
131- static void
132- mutex_mark (void * ptr )
133- {
134- rb_mutex_t * mutex = ptr ;
135- VALUE fiber ;
136- if (locked_p (mutex )) {
137- fiber = rb_fiberptr_self (mutex -> fiber ); // rb_fiber_t* doesn't move along with fiber object
138- if (fiber ) rb_gc_mark_movable (fiber );
139- rb_gc_mark_movable (mutex -> thread );
140- }
141- }
142-
143- static void
144- mutex_compact (void * ptr )
145- {
146- rb_mutex_t * mutex = ptr ;
147- if (locked_p (mutex )) {
148- mutex -> thread = rb_gc_location (mutex -> thread );
149- }
150- }
151-
152126static void
153127mutex_free (void * ptr )
154128{
155129 rb_mutex_t * mutex = ptr ;
156- if (locked_p (mutex )) {
157- const char * err = rb_mutex_unlock_th (mutex , rb_thread_ptr (mutex -> thread ), mutex -> fiber );
130+ if (mutex -> fiber ) {
131+ /* rb_warn("free locked mutex"); */
132+ const char * err = rb_mutex_unlock_th (mutex , rb_fiber_threadptr (mutex -> fiber ), mutex -> fiber );
158133 if (err ) rb_bug ("%s" , err );
159134 }
160135 ruby_xfree (ptr );
@@ -168,7 +143,7 @@ mutex_memsize(const void *ptr)
168143
169144static const rb_data_type_t mutex_data_type = {
170145 "mutex" ,
171- {mutex_mark , mutex_free , mutex_memsize , mutex_compact , },
146+ {mutex_mark , mutex_free , mutex_memsize ,},
172147 0 , 0 , RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY
173148};
174149
@@ -229,13 +204,12 @@ rb_mutex_locked_p(VALUE self)
229204{
230205 rb_mutex_t * mutex = mutex_ptr (self );
231206
232- return RBOOL (locked_p ( mutex ) );
207+ return RBOOL (mutex -> fiber );
233208}
234209
235210static void
236211thread_mutex_insert (rb_thread_t * thread , rb_mutex_t * mutex )
237212{
238- RUBY_ASSERT (!mutex -> next_mutex );
239213 if (thread -> keeping_mutexes ) {
240214 mutex -> next_mutex = thread -> keeping_mutexes ;
241215 }
@@ -260,24 +234,10 @@ thread_mutex_remove(rb_thread_t *thread, rb_mutex_t *mutex)
260234}
261235
262236static void
263- mutex_set_owner (VALUE self , rb_thread_t * th , rb_fiber_t * fiber )
264- {
265- rb_mutex_t * mutex = mutex_ptr (self );
266-
267- mutex -> thread = th -> self ;
268- mutex -> fiber = fiber ;
269- RB_OBJ_WRITTEN (self , Qundef , th -> self );
270- if (fiber ) {
271- RB_OBJ_WRITTEN (self , Qundef , rb_fiberptr_self (fiber ));
272- }
273- }
274-
275- static void
276- mutex_locked (rb_thread_t * th , rb_fiber_t * fiber , VALUE self )
237+ mutex_locked (rb_thread_t * th , VALUE self )
277238{
278239 rb_mutex_t * mutex = mutex_ptr (self );
279240
280- mutex_set_owner (self , th , fiber );
281241 thread_mutex_insert (th , mutex );
282242}
283243
@@ -298,8 +258,9 @@ rb_mutex_trylock(VALUE self)
298258
299259 rb_fiber_t * fiber = GET_EC ()-> fiber_ptr ;
300260 rb_thread_t * th = GET_THREAD ();
261+ mutex -> fiber = fiber ;
301262
302- mutex_locked (th , fiber , self );
263+ mutex_locked (th , self );
303264 return Qtrue ;
304265 }
305266 else {
@@ -367,7 +328,7 @@ do_mutex_lock(VALUE self, int interruptible_p)
367328 rb_ensure (call_rb_fiber_scheduler_block , self , delete_from_waitq , (VALUE )& sync_waiter );
368329
369330 if (!mutex -> fiber ) {
370- mutex_set_owner ( self , th , fiber ) ;
331+ mutex -> fiber = fiber ;
371332 }
372333 }
373334 else {
@@ -397,7 +358,6 @@ do_mutex_lock(VALUE self, int interruptible_p)
397358 rb_ractor_sleeper_threads_inc (th -> ractor );
398359 rb_check_deadlock (th -> ractor );
399360
400- RUBY_ASSERT (!th -> locking_mutex );
401361 th -> locking_mutex = self ;
402362
403363 ccan_list_add_tail (& mutex -> waitq , & sync_waiter .node );
@@ -408,7 +368,7 @@ do_mutex_lock(VALUE self, int interruptible_p)
408368
409369 // unlocked by another thread while sleeping
410370 if (!mutex -> fiber ) {
411- mutex_set_owner ( self , th , fiber ) ;
371+ mutex -> fiber = fiber ;
412372 }
413373
414374 rb_ractor_sleeper_threads_dec (th -> ractor );
@@ -422,13 +382,10 @@ do_mutex_lock(VALUE self, int interruptible_p)
422382 if (interruptible_p ) {
423383 /* release mutex before checking for interrupts...as interrupt checking
424384 * code might call rb_raise() */
425- if (mutex -> fiber == fiber ) {
426- mutex -> thread = Qfalse ;
427- mutex -> fiber = NULL ;
428- }
385+ if (mutex -> fiber == fiber ) mutex -> fiber = 0 ;
429386 RUBY_VM_CHECK_INTS_BLOCKING (th -> ec ); /* may release mutex */
430387 if (!mutex -> fiber ) {
431- mutex_set_owner ( self , th , fiber ) ;
388+ mutex -> fiber = fiber ;
432389 }
433390 }
434391 else {
@@ -447,7 +404,7 @@ do_mutex_lock(VALUE self, int interruptible_p)
447404 }
448405
449406 if (saved_ints ) th -> ec -> interrupt_flag = saved_ints ;
450- if (mutex -> fiber == fiber ) mutex_locked (th , fiber , self );
407+ if (mutex -> fiber == fiber ) mutex_locked (th , self );
451408 }
452409
453410 RUBY_DEBUG_LOG ("%p locked" , mutex );
0 commit comments