# class File

### Public Instance Methods

lock_exclusive() { |self| ... } click to toggle source

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

lock_shared() { |self| ... } click to toggle source

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.

    # File lib/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