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 56 57 58
|
module AMQP
module ChannelIdAllocator
MAX_CHANNELS_PER_CONNECTION = (2**16) - 1
# Resets channel allocator. This method is thread safe.
# @api public
# @see Channel.next_channel_id
# @see Channel.release_channel_id
def reset_channel_id_allocator
channel_id_mutex.synchronize do
int_allocator.reset
end
end
# Releases previously allocated channel id. This method is thread safe.
#
# @param [Fixnum] Channel id to release
# @api public
# @see Channel.next_channel_id
# @see Channel.reset_channel_id_allocator
def release_channel_id(i)
channel_id_mutex.synchronize do
int_allocator.release(i)
end
end
# Returns next available channel id. This method is thread safe.
#
# @return [Fixnum]
# @api public
# @see Channel.release_channel_id
# @see Channel.reset_channel_id_allocator
def next_channel_id
channel_id_mutex.synchronize do
result = int_allocator.allocate
raise "No further channels available. Please open a new connection." if result < 0
result
end
end
private
# @private
# @api private
def channel_id_mutex
@channel_id_mutex ||= Mutex.new
end
# @private
def int_allocator
# TODO: ideally, this should be in agreement with agreed max number of channels of the connection,
# but it is possible that value either not yet available. MK.
@int_allocator ||= IntAllocator.new(1, MAX_CHANNELS_PER_CONNECTION)
end
end
end
|