summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorHans Mulder <hansmu@xs4all.nl>1998-06-08 09:10:02 -0700
committerGurusamy Sarathy <gsar@cpan.org>1998-06-10 05:44:44 +0000
commita99072da2bc541e260dfb72e5ba6c9d6c6136d42 (patch)
treee6bec998fb3b0082517af445b551efdf445e5517 /ext
parent97abc6adffcd3efcbaee73cbdad2055b2d06be4f (diff)
downloadperl-a99072da2bc541e260dfb72e5ba6c9d6c6136d42.tar.gz
Doc & feature patch for Thread::Queue
Message-Id: <3.0.5.32.19980608161002.00a64a70@ous.edu> p4raw-id: //depot/perl@1085
Diffstat (limited to 'ext')
-rw-r--r--ext/Thread/Thread/Queue.pm66
1 files changed, 65 insertions, 1 deletions
diff --git a/ext/Thread/Thread/Queue.pm b/ext/Thread/Thread/Queue.pm
index 9821773aa4..6d5f82be34 100644
--- a/ext/Thread/Thread/Queue.pm
+++ b/ext/Thread/Thread/Queue.pm
@@ -10,8 +10,56 @@ Thread::Queue - thread-safe queues
use Thread::Queue;
my $q = new Thread::Queue;
$q->enqueue("foo", "bar");
- my $foo = $q->dequeue; # The "bar" is still in the queue.
+ my $foo = $q->dequeue; # The "bar" is still in the queue.
+ my $foo = $q->dequeue_nb; # returns "bar", or undef if the queue was
+ # empty
+ my $left = $q->pending; # returns the number of items still in the queue
+=head1 DESCRIPTION
+
+A queue, as implemented by C<Thread::Queue> is a thread-safe data structure
+much like a list. Any number of threads can safely add elements to the end
+of the list, or remove elements from the head of the list. (Queues don't
+permit adding or removing elements from the middle of the list)
+
+=head1 FUNCTIONS AND METHODS
+
+=over 8
+
+=item new
+
+The C<new> function creates a new empty queue.
+
+=item enqueue LIST
+
+The C<enqueue> method adds a list of scalars on to the end of the queue.
+The queue will grow as needed to accomodate the list.
+
+=item dequeue
+
+The C<dequeue> method removes a scalar from the head of the queue and
+returns it. If the queue is currently empty, C<dequeue> will block the
+thread until another thread C<enqueue>s a scalar.
+
+=item dequeue_nb
+
+The C<dequeue_nb> method, like the C<dequeue> method, removes a scalar from
+the head of the queue and returns it. Unlike C<dequeue>, though,
+C<dequeue_nb> won't block if the queue is empty, instead returning
+C<undef>.
+
+=item pending
+
+The C<pending> method returns the number of items still in the queue. (If
+there can be multiple readers on the queue it's best to lock the queue
+before checking to make sure that it stays in a consistent state)
+
+=back
+
+=head1 SEE ALSO
+
+L<Thread>
+
=cut
sub new {
@@ -26,10 +74,26 @@ sub dequeue {
return shift @$q;
}
+sub dequeue_nb {
+ use attrs qw(locked method);
+ my $q = shift;
+ if (@$q) {
+ return shift @$q;
+ } else {
+ return undef;
+ }
+}
+
sub enqueue {
use attrs qw(locked method);
my $q = shift;
push(@$q, @_) and cond_broadcast $q;
}
+sub pending {
+ use attrs qw(locked method);
+ my $q = shift;
+ return scalar(@$q);
+}
+
1;