# File lib/dynflow/semaphores/stateful.rb, line 7 def initialize(tickets, free = tickets, meta = {}) @tickets = tickets @free = free @waiting = [] @meta = meta end
# File lib/dynflow/semaphores/stateful.rb, line 65 def self.new_from_hash(hash) self.new(*hash.values_at(:tickets, :free, :meta)) end
# File lib/dynflow/semaphores/stateful.rb, line 50 def drain @free.tap do @free = 0 save end end
# File lib/dynflow/semaphores/stateful.rb, line 40 def get(n = 1) if n > @free drain else @free -= n save n end end
# File lib/dynflow/semaphores/stateful.rb, line 23 def get_waiting @waiting.shift end
# File lib/dynflow/semaphores/stateful.rb, line 27 def has_waiting? !@waiting.empty? end
# File lib/dynflow/semaphores/stateful.rb, line 31 def release(n = 1) @free += n @free = @tickets unless @tickets.nil? || @free <= @tickets save end
# File lib/dynflow/semaphores/stateful.rb, line 37 def save end
# File lib/dynflow/semaphores/stateful.rb, line 57 def to_hash { :tickets => @tickets, :free => @free, :meta => @meta } end
# File lib/dynflow/semaphores/stateful.rb, line 14 def wait(thing) if get > 0 true else @waiting << thing false end end