module Redis::Objects::Locks::ClassMethods

Class methods that appear in your class when you include Redis::Objects.

Public Instance Methods

clear_lock(name, id) click to toggle source

Clear the lock. Use with care - usually only in an Admin page to clear stale locks (a stale lock should only happen if a server crashes.)

# File lib/redis/objects/locks.rb, line 58
def clear_lock(name, id)
  verify_lock_defined!(name)
  redis.del(redis_field_key("#{name}_lock", id))
end
lock(name, options={}) click to toggle source

Define a new lock. It will function like a model attribute, so it can be used alongside ActiveRecord/DataMapper, etc.

# File lib/redis/objects/locks.rb, line 17
def lock(name, options={})
  options[:timeout] ||= 5  # seconds
  lock_name = "#{name}_lock"
  redis_objects[lock_name.to_sym] = options.merge(:type => :lock)
  ivar_name = :"@#{lock_name}"

  mod = Module.new do
    define_method(lock_name) do |&block|
      instance_variable_get(ivar_name) or
        instance_variable_set(ivar_name,
          Redis::Lock.new(
            redis_field_key(lock_name), redis_field_redis(lock_name), redis_objects[lock_name.to_sym]
          )
        )
    end
  end

  if options[:global]
    extend mod

    # dispatch to class methods
    define_method(lock_name) do |&block|
      self.class.public_send(lock_name, &block)
    end
  else
    include mod
  end
end
obtain_lock(name, id, &block) click to toggle source

Obtain a lock, and execute the block synchronously. Any other code (on any server) will spin waiting for the lock up to the :timeout that was specified when the lock was defined.

# File lib/redis/objects/locks.rb, line 49
def obtain_lock(name, id, &block)
  verify_lock_defined!(name)
  raise ArgumentError, "Missing block to #{self.name}.obtain_lock" unless block_given?
  lock_name = "#{name}_lock"
  Redis::Lock.new(redis_field_key(lock_name, id), redis_field_redis(lock_name), redis_objects[lock_name.to_sym]).lock(&block)
end

Private Instance Methods

verify_lock_defined!(name) click to toggle source
# File lib/redis/objects/locks.rb, line 65
def verify_lock_defined!(name)
  unless redis_objects.has_key?("#{name}_lock".to_sym)
    raise Redis::Objects::UndefinedLock, "Undefined lock :#{name} for class #{self.name}"
  end
end