Spread::Queue::FIFO - basic FIFO queue


Spread-Queue documentation Contained in the Spread-Queue distribution.

Index


Code Index:

NAME

Top

Spread::Queue::FIFO - basic FIFO queue

SYNOPSIS

Top

  use Spread::Queue::FIFO;

  my $q = new Spread::Queue::FIFO ("to-do list");
  enqueue $q, "eat breakfast", "go to work";
  my $task = dequeue $q;

DESCRIPTION

Top

Basic FIFO queue service. Not thread-safe.

Logging via Log::Channel.

METHODS

Top

  my $q = new Spread::Queue::FIFO ("to-do list");

Creates a named FIFO queue. Name will be included in each log message.

  enqueue $q, "eat breakfast", "go to work";

Append one or more items to the end of a queue.

  my $node = dequeue $q;
  my ($queue_pending_time, $task) = @$node;

Remove the first item from the front of the queue and return it.

  my $tasks = $q->pending;

Retrieve number of items in the queue.

 foreach my $item ($q->all) { ... }

Return the queue contents as a list, for inspection.

AUTHOR

Top

Jason W. May <jmay@pobox.com>

COPYRIGHT

Top

SEE ALSO

Top

  L<Spread::Queue>


Spread-Queue documentation Contained in the Spread-Queue distribution.
package Spread::Queue::FIFO;

require 5.005_03;
use strict;
use vars qw($VERSION);
$VERSION = '0.3';

use Time::HiRes qw( time );	# for queue pending time metrics
use Log::Channel;

BEGIN {
    my $qlog = new Log::Channel;
    sub qlog { $qlog->(@_) }
}

sub new {
    my $proto = shift;
    my $class = ref ($proto) || $proto;

    my $self  = {};
    bless ($self, $class);

    $self->{NAME} = shift;	# optional
    $self->{QUEUE} = [];

    return $self;
}

sub enqueue {
    my $self = shift;

    qlog "enqueue $self->{NAME}\n";

    push (@{$self->{QUEUE}},
	  [ shift, time ]
	 );
}

sub dequeue {
    my $self = shift;

    qlog "dequeue $self->{NAME}\n";

    my $node = shift @{$self->{QUEUE}};

    return if !$node;

    my ($data, $timestamp) = @$node;
    return wantarray ?
      ( $node->[0], time - $node->[1] )
	: $node->[0];
}

sub pending {
    my $self = shift;

    return scalar @{$self->{QUEUE}};
}

sub all {
    my $self = shift;

    return map { $_->[0] } @{$self->{QUEUE}};
}

sub length {
    my $self = shift;

    return scalar(@{$self->{QUEUE}});
}

1;