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