Queue (Class)

In: thread.rb
Parent: Object

This class provides a way to communicate data between threads.

TODO: an example (code or English) would really help here. How do you set up a queue between two threads?

Methods

<<   clear   deq   empty?   enq   length   new   num_waiting   pop   push   shift   size  

Public Class methods

Creates a new queue.

[Source]

# File thread.rb, line 239
  def initialize
    @que = []
    @waiting = []
    @que.taint          # enable tainted comunication

    @waiting.taint
    self.taint
  end

Public Instance methods

<<(obj)

Alias for push

Removes all objects from the queue.

[Source]

# File thread.rb, line 297
  def clear
    @que.clear
  end
deq(non_block=false)

Alias for pop

Returns true is the queue is empty.

[Source]

# File thread.rb, line 290
  def empty?
    @que.empty?
  end
enq(obj)

Alias for push

Returns the length of the queue.

[Source]

# File thread.rb, line 304
  def length
    @que.length
  end

Returns the number of threads waiting on the queue.

[Source]

# File thread.rb, line 318
  def num_waiting
    @waiting.size
  end

Retrieves data from the queue. If the queue is empty, the calling thread is suspended until data is pushed onto the queue. If non_block is true, the thread isn’t suspended, and an exception is raised.

[Source]

# File thread.rb, line 274
  def pop(non_block=false)
    while (Thread.critical = true; @que.empty?)
      raise ThreadError, "queue empty" if non_block
      @waiting.push Thread.current
      Thread.stop
    end
    @que.shift
  ensure
    Thread.critical = false
  end

Pushes obj to the queue.

[Source]

# File thread.rb, line 250
  def push(obj)
    Thread.critical = true
    @que.push obj
    begin
      t = @waiting.shift
      t.wakeup if t
    rescue ThreadError
      retry
    ensure
      Thread.critical = false
    end
    begin
      t.run if t
    rescue ThreadError
    end
  end
shift(non_block=false)

Alias for pop

Alias of length.

[Source]

# File thread.rb, line 311
  def size
    length
  end

[Validate]