Sha256: cb31ed8d23a361fc5c29f6595dc3e1b6641214f59a8dad1f2310c494a848c971

Contents?: true

Size: 1.37 KB

Versions: 13

Compression:

Stored size: 1.37 KB

Contents

module Ohm
  # This module is a straight extraction from Ohm. The only difference is
  # that this allows for a custom sleep value.
  #
  # In addition, since future ohm versions might drop mutexes, I thought it
  # might be a good idea to preseve this feature as a drop-in module.
  module Locking
    # Lock the object before executing the block, and release it once the block
    # is done.
    #
    # @example
    #
    #   post = Order.create(:customer => Customer.create)
    #   post.mutex(0.01) do
    #     # this block is in a mutex!
    #   end
    def mutex(wait = 0.1)
      lock!(wait)
      yield
      self
    ensure
      unlock!
    end

  protected
    # Lock the object so no other instances can modify it.
    # This method implements the design pattern for locks
    # described at: http://code.google.com/p/redis/wiki/SetnxCommand
    #
    # @see Model#mutex
    def lock!(wait = 0.1)
      until key[:_lock].setnx(lock_timeout)
        next unless lock = key[:_lock].get
        sleep(wait) and next unless lock_expired?(lock)

        break unless lock = key[:_lock].getset(lock_timeout)
        break if lock_expired?(lock)
      end
    end

    # Release the lock.
    # @see Model#mutex
    def unlock!
      key[:_lock].del
    end

    def lock_timeout
      Time.now.to_f + 1
    end

    def lock_expired? lock
      lock.to_f < Time.now.to_f
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
ohm-contrib-0.1.2 lib/ohm/contrib/locking.rb
ohm-contrib-0.1.1 lib/ohm/contrib/locking.rb
ohm-contrib-0.1.0 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.42 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.41 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.40 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.39 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.38 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.37 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.36 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.35 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.34 lib/ohm/contrib/locking.rb
ohm-contrib-0.0.33 lib/ohm/contrib/locking.rb