Sha256: 766004990bc00b15d1df0147c85850b6785ee25a7dddbaf4d5b24ece5de47d8d

Contents?: true

Size: 1.18 KB

Versions: 25

Compression:

Stored size: 1.18 KB

Contents

# frozen_string_literal: true
module Dynflow
  module Semaphores
    class Stateful < Abstract

      attr_reader :free, :tickets, :waiting, :meta

      def initialize(tickets, free = tickets, meta = {})
        @tickets = tickets
        @free = free
        @waiting = []
        @meta = meta
      end

      def wait(thing)
        if get > 0
          true
        else
          @waiting << thing
          false
        end
      end

      def get_waiting
        @waiting.shift
      end

      def has_waiting?
        !@waiting.empty?
      end

      def release(n = 1)
        @free += n
        @free = @tickets unless @tickets.nil? || @free <= @tickets
        save
      end

      def save
      end

      def get(n = 1)
        if n > @free
          drain
        else
          @free -= n
          save
          n
        end
      end

      def drain
        @free.tap do
          @free = 0
          save
        end
      end

      def to_hash
        {
          :tickets => @tickets,
          :free => @free,
          :meta => @meta
        }
      end

      def self.new_from_hash(hash)
        self.new(*hash.values_at(:tickets, :free, :meta))
      end
    end
  end
end

Version data entries

25 entries across 25 versions & 1 rubygems

Version Path
dynflow-1.8.2 lib/dynflow/semaphores/stateful.rb
dynflow-1.8.1 lib/dynflow/semaphores/stateful.rb
dynflow-1.8.0 lib/dynflow/semaphores/stateful.rb
dynflow-1.7.0 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.11 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.10 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.8 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.7 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.6 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.5 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.4 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.3 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.2 lib/dynflow/semaphores/stateful.rb
dynflow-1.6.1 lib/dynflow/semaphores/stateful.rb
dynflow-1.4.9 lib/dynflow/semaphores/stateful.rb
dynflow-1.4.8 lib/dynflow/semaphores/stateful.rb
dynflow-1.5.0 lib/dynflow/semaphores/stateful.rb
dynflow-1.4.7 lib/dynflow/semaphores/stateful.rb
dynflow-1.4.6 lib/dynflow/semaphores/stateful.rb
dynflow-1.4.5 lib/dynflow/semaphores/stateful.rb