Get an exclusive (i.e., write) lock on the file, and yield to the block. If the lock is not available, wait for it without blocking other ruby threads.
# File lib/puppet/external/lock.rb, line 21 def lock_exclusive if Thread.list.size == 1 flock(LOCK_EX) else # ugly hack because waiting for a lock in a Ruby thread blocks the # process period = 0.001 until flock(LOCK_EX|LOCK_NB) sleep period period *= 2 if period < 1 end end yield self ensure flush flock(LOCK_UN) end