1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
# frozen_string_literal: true
# Released under the MIT License.
# Copyright, 2019-2022, by Samuel Williams.
require 'console/logger'
require 'async/notification'
require 'async/semaphore'
module Async
module Pool
# The basic interface required by a pool resource.
class Resource
# Constructs a resource.
def self.call
self.new
end
def initialize(concurrency = 1)
@concurrency = concurrency
@closed = false
@count = 0
end
# @attr [Integer] The concurrency of this resource, 1 (singleplex) or more (multiplex).
attr :concurrency
# @attr [Integer] The number of times this resource has been used.
attr :count
# Whether this resource can be acquired.
# @return [Boolean] whether the resource can actually be used.
def viable?
!@closed
end
# Whether the resource has been closed by the user.
# @return [Boolean] whether the resource has been closed or has failed.
def closed?
@closed
end
# Close the resource explicitly, e.g. the pool is being closed.
def close
@closed = true
end
# Whether this resource can be reused. Used when releasing resources back into the pool.
def reusable?
!@closed
end
end
end
end
|