class Mutex # call-seq: # mutex.synchronize { ... } # # Obtains a lock, runs the block, and releases the lock when the # block completes. See the example under Mutex. def synchronize self.lock begin yield ensure self.unlock rescue nil end end end class Thread MUTEX_FOR_THREAD_EXCLUSIVE = Mutex.new # :nodoc: # call-seq: # Thread.exclusive { block } => obj # # Wraps a block in Thread.critical, restoring the original value # upon exit from the critical section, and returns the value of the # block. def self.exclusive MUTEX_FOR_THREAD_EXCLUSIVE.synchronize{ yield } end end