Class: File

Inherits:
Object show all
Defined in:
lib/vendor/puppet/external/lock.rb

Instance Method Summary collapse

Instance Method Details

#lock_exclusiveObject

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_sharedObject

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