Class: File
Instance Method Summary collapse
-
#lock_exclusive ⇒ Object
Get an exclusive (i.e., write) lock on the file, and yield to the block.
-
#lock_shared ⇒ Object
Get a shared (i.e., read) lock on the file, and yield to the block.
Instance Method Details
#lock_exclusive ⇒ Object
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.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/vendor/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 |
#lock_shared ⇒ Object
Get a shared (i.e., read) lock on the file, and yield to the block. If the lock is not available, wait for it without blocking other ruby threads.
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/vendor/puppet/external/lock.rb', line 43 def lock_shared if Thread.list.size == 1 flock(LOCK_SH) else # ugly hack because waiting for a lock in a Ruby thread blocks the # process period = 0.001 until flock(LOCK_SH|LOCK_NB) sleep period period *= 2 if period < 1 end end yield self ensure Thread.exclusive {flock(LOCK_UN) if $reader_count[self.stat.ino] == 1} ## for solaris, no need to unlock here--closing does it ## but this has no effect on the bug end |