lib/semian/resource.rb



# frozen_string_literal: true

module Semian
  class Resource # :nodoc:
    attr_reader :name

    class << Semian::Resource
      # Ensure that there can only be one resource of a given type
      def instance(name, **kwargs)
        Semian.resources[name] ||= ProtectedResource.new(name, new(name, **kwargs), nil)
      end

      private

      def redefinable(method_name)
        alias_method(method_name, method_name) # Silence method redefinition warnings
      end
    end

    def initialize(name, tickets: nil, quota: nil, permissions: Semian.default_permissions, timeout: 0)
      unless name.is_a?(String) || name.is_a?(Symbol)
        raise TypeError, "name must be a string or symbol, got: #{name.class}"
      end

      if Semian.semaphores_enabled?
        if respond_to?(:initialize_semaphore)
          initialize_semaphore("#{Semian.namespace}#{name}", tickets, quota, permissions, timeout)
        end
      else
        Semian.issue_disabled_semaphores_warning
      end
      @name = name
    end

    redefinable def reset_registered_workers!
    end

    redefinable def destroy
    end

    redefinable def unregister_worker
    end

    redefinable def acquire(*)
      wait_time = 0
      yield wait_time
    end

    redefinable def acquire_semaphore
      0
    end

    redefinable def release_semaphore
    end

    redefinable def count
      0
    end

    redefinable def tickets
      0
    end

    redefinable def registered_workers
      0
    end

    redefinable def semid
      0
    end

    redefinable def key
      "0x00000000"
    end

    redefinable def in_use?
      false
    end
  end
end