/usr/local/CPAN/File-Lock-Multi/File/Lock/Multi/Base/Iterative.pm
#!perl
package File::Lock::Multi::Base::Iterative;
use strict;
use warnings (FATAL => 'all');
use File::Lock::Multi::Base;
use base q(File::Lock::Multi::Base);
use Time::HiRes qw(sleep);
__PACKAGE__->mk_accessors(qw(iteration_delay));
return 1;
sub _lock {
my $self = shift;
return $self->_iterate(sub {
my($me, $now) = @_;
return $me->lock_non_block_for($now);
});
}
sub lockers {
my $self = shift;
my @lockers = ();
$self->_iterate(sub {
my($me, $now) = @_;
push(@lockers, $now) if($me->lock_held_for($now));
return;
});
return @lockers;
}
sub lock_held_for {
my $self = shift;
return !$self->obtain_lock_for(@_);
}
sub _iterate {
my($self, $code) = @_;
my $max = $self->max;
my $now = 1;
my $delay = $self->iteration_delay;
my $rv;
while($now <= $max) {
if(my $rv = $code->($self, $now)) {
return $rv;
}
$now++;
sleep($delay) if $delay && $now <= $max;
}
return;
}