AnyEvent-Retry
view release on metacpan or search on metacpan
lib/AnyEvent/Retry/Coro.pm view on Meta::CPAN
my ($self, $i) = @_;
weaken $self;
$self->running_coro(async {
$self->handle_result($self->run_code);
$self->clear_running_coro if defined $self;
});
};
sub DEMOLISH {
my $self = shift;
$self->running_coro->throw('DEMOLISH');
}
sub wait {
my ($status, @args) = Coro::rouse_wait();
return $args[0] if $status eq 'success';
die $args[1];
}
sub run {
my $self = shift;
t/retry-basic-coro.t view on Meta::CPAN
try => sub { Coro::AnyEvent::sleep 1; return 0 },
);
my $kill = async {
while(1){
Coro::AnyEvent::sleep 1;
undef $r2;
}
};
throws_ok {
$r2->run;
} qr/DEMOLISH/, 'demolition still works';
$kill->cancel;
done_testing;
t/retry-maxtimes.t view on Meta::CPAN
my $r = AnyEvent::Retry->new(
on_failure => sub { $cv->croak($_[1]) },
on_success => sub { $cv->send($_[0]) },
max_tries => 3,
interval => { Fibonacci => { scale => 1/1000 } },
try => sub { $_[0]->() }, # never successful (smash with hammer!)
);
$r->start;
throws_ok {
$cv->recv;
} qr/3/, 'max_tries exceeded after 3';
done_testing;
t/retry-undef.t view on Meta::CPAN
interval => { Fibonacci => { scale => 1/1000 } },
try => sub {}, # do nothing
);
$r->start;
my $t = AnyEvent->timer( after => 0.1, cb => sub {
ok !$r->has_timer, 'no timer running';
undef $r;
} );
throws_ok {
$cv->recv;
} qr/DEMOLISH/,
'we destroyed $r and the failure callback was called with DEMOLISH';
}
{
my $cv = AnyEvent->condvar;
my $r = AnyEvent::Retry->new(
on_failure => sub { $cv->croak($_[1]) },
on_success => sub { $cv->send($_[0]) },
t/retry-undef.t view on Meta::CPAN
interval => { Constant => { interval => 9999 } },
try => sub { $_[0]->(0) }, # always unsuccessful
);
$r->start;
my $t = AnyEvent->timer( after => 0.1, cb => sub {
ok $r->has_timer, 'timer is running';
undef $r;
} );
throws_ok {
$cv->recv;
} qr/DEMOLISH/,
'we get the DEMOLISH message even when the timer is running';
}
done_testing;
( run in 0.264 second using v1.01-cache-2.11-cpan-496ff517765 )