module Mongoid::Semaphore

Public Class Methods

included(base) click to toggle source
Calls superclass method
# File lib/mongoid/semaphore.rb, line 29
def self.included(base)
  super if defined?(super)
  base.class_eval do
    # => Define necessary fields for synchronization
    unless base.included_modules.include?(Mongoid::Document)
      include Mongoid::Document
    end
    base.extend(Mongoid::Semaphore::ClassMethods)
    # =>  Semaphore Counter
    field :sema_count, :type => Integer, :default => lambda { self.class.__semaphore_initial_count }
  end
end

Public Instance Methods

reset_semaphore!() click to toggle source
# File lib/mongoid/semaphore/sync_methods.rb, line 3
def reset_semaphore!
  self.update_attributes!({:sema_count => __semaphore_initial_count})
end
sema_count() click to toggle source
Calls superclass method
# File lib/mongoid/semaphore.rb, line 21
def sema_count
  self.save()
  self.reload
  return super
end
sema_down() click to toggle source
# File lib/mongoid/semaphore/sync_methods.rb, line 11
def sema_down
  self.dec(:sema_count, 1)
end
sema_ready?() click to toggle source
# File lib/mongoid/semaphore/sync_methods.rb, line 15
def sema_ready?
  self.save()
  self.reload()
  return (self.sema_count >= 0)
end
sema_up() click to toggle source
# File lib/mongoid/semaphore/sync_methods.rb, line 7
def sema_up
  self.inc(:sema_count, 1)
end
synchronized(&block) click to toggle source
# File lib/mongoid/semaphore/sync_methods.rb, line 21
def synchronized(&block)
  begin
    self.sema_down
    if (self.sema_ready?)
      block.call()
    else
      raise Mongoid::Semaphore::UnsynchronizedAccess.new(self.sema_count)
    end
  ensure
    self.sema_up
  end
end
try_synchronized(&try_block) click to toggle source
# File lib/mongoid/semaphore/sync_methods.rb, line 34
def try_synchronized(&try_block)
  return false unless self.sema_ready?
  begin
    self.synchronized do
      try_block.call()
    end
    return true
  rescue Mongoid::Semaphore::UnsynchronizedAccess => ua
    return false
  end
end