use strict;
use warnings;
-our $VERSION = '3.06';
+our $VERSION = '3.07';
$VERSION = eval $VERSION;
use threads::shared 1.21;
# Wait for requisite number of items
cond_wait(%$self) while ((@$queue < $count) && ! $$self{'ENDED'});
- cond_signal(%$self) if ((@$queue > $count) || $$self{'ENDED'});
+ cond_signal(%$self) if ((@$queue >= $count) || $$self{'ENDED'});
# If no longer blocking, try getting whatever is left on the queue
return $self->dequeue_nb($count) if ($$self{'ENDED'});
while ((@$queue < $count) && ! $$self{'ENDED'}) {
last if (! cond_timedwait(%$self, $timeout));
}
- cond_signal(%$self) if ((@$queue > $count) || $$self{'ENDED'});
+ cond_signal(%$self) if ((@$queue >= $count) || $$self{'ENDED'});
# Get whatever we need off the queue if available
return $self->dequeue_nb($count);
=head1 VERSION
-This document describes Thread::Queue version 3.06
+This document describes Thread::Queue version 3.07
=head1 SYNOPSIS
my $q = Thread::Queue->new(1, 2);
$q->limit = 4;
$q->enqueue(3, 4, 5); # Does not block
- $q->enqueue(6); # Blocks until at least 2 items are
- # dequeued
- my $size = $q->limit; # Returns the current limit (may return
- # 'undef')
+ $q->enqueue(6); # Blocks until at least 2 items are dequeued
+
+ my $size = $q->limit; # Returns the current limit (may return 'undef')
$q->limit = 0; # Queue size is now unlimited
=item ->end()
VARIABLE"> the queue inside a local block:
{
- lock($q); # Keep other threads from changing the queue's
- # contents
+ lock($q); # Keep other threads from changing the queue's contents
my $item = $q->peek();
if ($item ...) {
...
queue from the specified position (i.e. if queue size + index + count is
greater than zero):
- $q->enqueue(qw/foo bar baz/);
- my @nada = $q->extract(-6, 2); # Returns () - (3+(-6)+2) <= 0
- my @some = $q->extract(-6, 4); # Returns (foo) - (3+(-6)+4) > 0
- # Queue now contains: bar, baz
-my @rest = $q->extract(-3, 4); # Returns (bar, baz) - (2+(-3)+4) > 0
+ $q->enqueue(qw/foo bar baz/);
+ my @nada = $q->extract(-6, 2); # Returns () - (3+(-6)+2) <= 0
+ my @some = $q->extract(-6, 4); # Returns (foo) - (3+(-6)+4) > 0
+ # Queue now contains: bar, baz
+ my @rest = $q->extract(-3, 4); # Returns (bar, baz) - (2+(-3)+4) > 0
=back
# (6) Get reports from main
my @items = $rpt->dequeue(5);
is_deeply(\@items, [4, 3, 4, 3, 'go'], 'Queue reports');
-
- # Dequeue all items
- @items = $q->dequeue_nb(99);
- is_deeply(\@items, [5, 'foo', 6, 7], 'Queue items');
});
# (2) Read queue limit from thread
# Read an item from queue
$item = $q->dequeue();
is($item, 3, 'Dequeued item 3');
-# q = (3, 4, 5); r = (4)
+# q = (4, 5, 'foo'); r = (4, 3, 4)
# Report back the queue count
$rpt->enqueue($q->pending);
# q = (4, 5, 'foo'); r = (4, 3, 4, 3)
-# Read an item from queue
-$item = $q->dequeue();
-is($item, 4, 'Dequeued item 4');
+# Read all items from queue
+my @item = $q->dequeue(3);
+is_deeply(\@item, [4, 5, 'foo'], 'Dequeued 3 items');
# Thread is now unblocked
+@item = $q->dequeue(2);
+is_deeply(\@item, [6, 7], 'Dequeued 2 items');
+
+# Thread is now unblocked
# Handshake with thread
$rpt->enqueue('go');