Class: Qpid::Proton::WorkQueue

Inherits:
Object
  • Object
show all
Defined in:
lib/core/work_queue.rb

Overview

A thread-safe queue of work for multi-threaded programs.

A Container can have multiple threads calling Container#run The container ensures that work associated with a single Connection or Listener is serialized - two threads will never concurrently call handlers associated with the same object.

To have your own code serialized in the same, add a block to the connection's WorkQueue. The block will be invoked as soon as it is safe to do so.

A Connection and the objects associated with it (Session, Sender, Receiver, Delivery, Tracker) are not thread safe, so if you have multiple threads calling Container#run or if you want to affect objects managed by the container from non-container threads you need to use the WorkQueue

Defined Under Namespace

Classes: StoppedError

Instance Method Summary collapse

Instance Method Details

#add {|| ... }

Note:

Thread Safe: may be called in any thread.

This method returns an undefined value.

Add a block of code to be invoked in sequence.

Yields:

  • ()

    the block will be invoked with no parameters in the appropriate thread context

Raises:

  • (StoppedError)

    if the queue is closed and cannot accept more work



49
50
51
# File 'lib/core/work_queue.rb', line 49

def add(&block)
  schedule(0, &block)
end

#schedule(at) {|| ... }

Note:

Thread Safe: may be called in any thread.

This method returns an undefined value.

Schedule a block to be invoked at a certain time.

Parameters:

  • at (Time)

    Invoke block as soon as possible after Time at

  • at (Numeric)

    Invoke block after a delay of at seconds from now

Yields:

  • ()

    (see #add)

Raises:

  • (StoppedError)

    if the queue is closed and cannot accept more work



61
62
63
64
65
66
67
68
# File 'lib/core/work_queue.rb', line 61

def schedule(at, &block)
  raise ArgumentError, "no block" unless block_given?
  @lock.synchronize do
    raise @closed if @closed
    @schedule.insert(at, block)
  end
  @container.send :wake
end