AnyEvent-Curl-Multi
view release on metacpan or search on metacpan
lib/AnyEvent/Curl/Multi.pm view on Meta::CPAN
=back
=cut
sub new {
my $class = shift;
my $self = $class->SUPER::new(
multi_h => WWW::Curl::Multi->new,
state => {},
timer_w => undef,
io_w => {},
queue => [],
max_concurrency => 0,
max_redirects => 0,
timeout => undef,
proxy => undef,
debug => undef,
ipresolve => undef,
@_
);
lib/AnyEvent/Curl/Multi.pm view on Meta::CPAN
scalar keys %{$self->{state}} < $self->{max_concurrency}) {
if (my $dequeued = shift @{$self->{queue}}) {
$self->{state}->{refaddr($dequeued->{easy_h})} = $dequeued;
# Add it to our multi handle
$self->{multi_h}->add_handle($dequeued->{easy_h});
} else {
last;
}
}
# Start our timer
$self->{timer_w} = AE::timer(0, 0.5, sub { $self->_perform });
}
sub _perform {
my $self = shift;
$self->{multi_h}->perform;
while (my ($id, $rv) = $self->{multi_h}->info_read) {
if ($id) {
my $state = $self->{state}->{$id};
lib/AnyEvent/Curl/Multi.pm view on Meta::CPAN
delete $self->{state}->{$id};
$self->_dequeue;
}
}
# We must recalculate the number of active handles here, because
# a user-provided callback may have added a new one.
my $active_handles = scalar keys %{$self->{state}};
if (! $active_handles) {
# Nothing left to do - no point keeping the watchers around anymore.
delete $self->{timer_w};
delete $self->{io_w};
return;
}
# Re-establish all I/O watchers
foreach my $fd (keys %{$self->{io_w}}) {
delete $self->{io_w}->{$fd};
}
my ($readfds, $writefds, $errfds) = $self->{multi_h}->fdset;
( run in 0.993 second using v1.01-cache-2.11-cpan-49f99fa48dc )