class RedisLock class Semaphore < Strategy def call(&block) ttl = args[:ttl] || lock.config.default_ttl set_opts = args[:set_opts] || {} while lock.locked? sleep (args[:wait] || 1) end lock.set(ttl, set_opts) _perform(&block) end def after_perform lock.unlock! end end end