Class SizedQueue
In: lib/thread.rb
Parent: Queue

This class represents queues of specified size capacity. The push operation may be blocked if the capacity is full.

See Queue for an example of how a SizedQueue works.

Methods

<<   deq   enq   max   max=   new   num_waiting   pop   push   shift  

Public Class methods

Creates a fixed-length queue with a maximum size of max.

[Source]

# File lib/thread.rb, line 374
  def initialize(max)
    raise ArgumentError, "queue size must be positive" unless max > 0
    @max = max
    @queue_wait = []
    @queue_wait.taint           # enable tainted comunication
    super()
  end

Public Instance methods

<<(obj)

Alias for push

deq(*args)

Alias for pop

enq(obj)

Alias for push

Returns the maximum size of the queue.

[Source]

# File lib/thread.rb, line 385
  def max
    @max
  end

Sets the maximum size of the queue.

[Source]

# File lib/thread.rb, line 392
  def max=(max)
    Thread.critical = true
    if max <= @max
      @max = max
      Thread.critical = false
    else
      diff = max - @max
      @max = max
      Thread.critical = false
      diff.times do
        begin
          t = @queue_wait.shift
          t.run if t
        rescue ThreadError
          retry
        end
      end
    end
    max
  end

Returns the number of threads waiting on the queue.

[Source]

# File lib/thread.rb, line 473
  def num_waiting
    @waiting.size + @queue_wait.size
  end

Retrieves data from the queue and runs a waiting thread, if any.

[Source]

# File lib/thread.rb, line 440
  def pop(*args)
    retval = super
    Thread.critical = true
    if @que.length < @max
      begin
        t = @queue_wait.shift
        t.wakeup if t
      rescue ThreadError
        retry
      ensure
        Thread.critical = false
      end
      begin
        t.run if t
      rescue ThreadError
      end
    end
    retval
  end

Pushes obj to the queue. If there is no space left in the queue, waits until space becomes available.

[Source]

# File lib/thread.rb, line 417
  def push(obj)
    Thread.critical = true
    while @que.length >= @max
      @queue_wait.push Thread.current
      Thread.stop
      Thread.critical = true
    end
    super
  end
shift(*args)

Alias for pop

[Validate]