Class: AMQ::IntAllocator

Inherits:
Object
  • Object
show all
Defined in:
lib/amq/int_allocator.rb

Overview

Simple bitset-based integer allocator, heavily inspired by com.rabbitmq.utility.IntAllocator class in the RabbitMQ Java client.

Unlike monotonically incrementing identifier, this allocator is suitable for very long running programs that aggressively allocate and release channels.

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (IntAllocator) initialize(lo, hi)

Returns a new instance of IntAllocator

Raises:

  • (ArgumentError)

    if upper boundary is not greater than the lower one



27
28
29
30
31
32
33
34
35
36
# File 'lib/amq/int_allocator.rb', line 27

def initialize(lo, hi)
  raise ArgumentError.new "upper boundary must be greater than the lower one (given: hi = #{hi}, lo = #{lo})" unless hi > lo

  @hi = hi
  @lo = lo

  @number_of_bits = hi - lo
  @range          = Range.new(1, @number_of_bits)
  @free_set       = BitSet.new(@number_of_bits)
end

Instance Attribute Details

- (Integer) hi (readonly)



20
21
22
# File 'lib/amq/int_allocator.rb', line 20

def hi
  @hi
end

- (Integer) lo (readonly)



22
23
24
# File 'lib/amq/int_allocator.rb', line 22

def lo
  @lo
end

- (Integer) number_of_bits (readonly)



18
19
20
# File 'lib/amq/int_allocator.rb', line 18

def number_of_bits
  @number_of_bits
end

Instance Method Details

- (Integer) allocate

Attempts to allocate next available integer. If allocation succeeds, allocated value is returned. Otherwise, nil is returned.

Current implementation of this method is O(n), where n is number of bits in the range available for allocation.



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/amq/int_allocator.rb', line 45

def allocate

  if n = @free_set.next_clear_bit

    if n < @hi - 1 then
      @free_set.set(n)
      n + 1
    else
      -1
    end

  else
    -1
  end
end

- (Boolean) allocated?(reservation)



71
72
73
# File 'lib/amq/int_allocator.rb', line 71

def allocated?(reservation)
  @free_set.get(reservation-1)
end

- (NilClass) free(reservation) Also known as: release

Releases previously allocated integer. If integer provided as argument was not previously allocated, this method has no effect.



65
66
67
# File 'lib/amq/int_allocator.rb', line 65

def free(reservation)
  @free_set.unset(reservation-1)
end

- (Object) reset

Releases the whole allocation range



76
77
78
# File 'lib/amq/int_allocator.rb', line 76

def reset
  @free_set.clear
end