Project

General

Profile

Bug #17827

Updated by Eregon (Benoit Daloze) over 3 years ago

According to our discussion here https://github.com/rspec/rspec-support/issues/501 it seems like typical implementation of per-thread reentrant mutex is no longer valid and can lead to some deadlock situation. 

 ``` 
 #!/usr/bin/env ruby 

 require 'monitor' 

 def monitor_failure 
	 m = Monitor.new 
	
	 f1 = Fiber.new do 
		 m.synchronize do 
			 puts "f1 A" 
			 Fiber.yield 
			 puts "f1 B" 
		 end 
	 end 
	
	 f2 = Fiber.new do 
		 m.synchronize do 
			 puts "f2 A" 
			 # Fiber.yield 
			 f1.resume 
			 puts "f2 B" 
		 end 
	 end 
	
	 f1.resume 
	 f2.resume 
	 f2.resume 
 end 

 monitor_failure 
 ```

Back