BEGIN { # Magic Perl CORE pragma
if ($ENV{PERL_CORE}) {
chdir 't' if -d 't';
@INC = '../lib';
}
}
use strict;
use warnings;
use Test::More tests => 1 + (2*10);
$SIG{__DIE__} = sub { require Carp; Carp::confess() };
$SIG{__WARN__} = sub { require Carp; Carp::confess() };
diag( "Test job submission from different threads" );
my $pool;
BEGIN { use_ok('Thread::Pool') }
my $t0 = () = threads->list; # remember number of threads now
my @list : shared;
my $count : shared = 0;
my $threads = 5;
my $times = 1000;
my $check;
$check .= $_ foreach 1..$times;
sub do { $_[0] }
sub stream { push( @list,$_[0] ) }
sub submit {
while (1) {
{
lock( $count );
return if $count == $times;
$pool->job( ++$count );
}
}
}
foreach my $optimize (qw(cpu memory)) {
@list= (); $count = 0;
$pool = Thread::Pool->new(
{
optimize => $optimize,
workers => $threads,
do => \&do,
stream => \&stream
}
);
isa_ok( $pool,'Thread::Pool', 'check object type' );
cmp_ok( scalar($pool->workers),'==',$threads,'check initial number of workers');
my @thread;
push( @thread,threads->new( \&submit ) ) foreach 1..$threads;
$_->join foreach @thread;
cmp_ok( $count,'==',$times, 'check count' );
$pool->shutdown;
cmp_ok( scalar(()=threads->list),'==',$t0,'check for remaining threads' );
cmp_ok( scalar($pool->workers),'==',0, 'check number of workers' );
cmp_ok( scalar($pool->removed),'==',$threads, 'check number of removed' );
cmp_ok( $pool->todo,'==',0, 'check # jobs todo' );
cmp_ok( $pool->done,'==',$times, 'check # jobs done' );
cmp_ok( scalar(@list),'==',$times, 'check length of list' );
is( join('',@list),$check, 'check result' );
}