class RSpec::Support::Mutex
On 1.8.7, it’s in the stdlib. We don’t want to load the stdlib, b/c this is a test tool, and can affect the test environment, causing tests to pass where they should fail.
So we’re transcribing/modifying it from github.com/ruby/ruby/blob/v1_8_7_374/lib/thread.rb#L56 Some methods we don’t need are deleted. Anything I don’t understand (there’s quite a bit, actually) is left in.
Some formatting changes are made to appease the robot overlord:
https://travis-ci.org/rspec/rspec-core/jobs/54410874
@private
On 1.9 and up, this is in core, so we just use the real one
Constants
Public Class Methods
# File rspec-support/lib/rspec/support/mutex.rb, line 18 def initialize @waiting = [] @locked = false @waiting.taint taint end
# File rspec-support/lib/rspec/support/reentrant_mutex.rb, line 70 def self.new NEW_MUTEX_METHOD.call end
Public Instance Methods
@private
# File rspec-support/lib/rspec/support/mutex.rb, line 26 def lock while Thread.critical = true && @locked @waiting.push Thread.current Thread.stop end @locked = true Thread.critical = false self end
@private
# File rspec-support/lib/rspec/support/mutex.rb, line 46 def synchronize lock begin yield ensure unlock end end
@private
# File rspec-support/lib/rspec/support/mutex.rb, line 37 def unlock return unless @locked Thread.critical = true @locked = false wakeup_and_run_waiting_thread self end