AnyEvent-Handle-UDP
view release on metacpan or search on metacpan
lib/AnyEvent/Handle/UDP.pm view on Meta::CPAN
sub _drained {
my $self = shift;
$self->{on_drain}->($self) if defined $self->{on_drain};
}
for my $dir ('', 'r', 'w') {
my $timeout = "${dir}timeout";
my $activity = "${dir}activity";
my $on_timeout = "on_$timeout";
my $timer = "${dir}timer";
my $clear_timeout = "clear_$timeout";
my $timeout_reset = "${timeout}_reset";
my $callback;
$callback = sub {
my $self = shift;
if (not exists $self->{$timeout} or not $self->{fh}) {
delete $self->{$timer};
return;
}
my $now = AE::now;
my $after = $self->{$activity} + $self->{$timeout} - $now;
if ($after <= 0) {
$self->{$activity} = $now;
my $time = $self->{$on_timeout};
my $error = do { local $! = Errno::ETIMEDOUT; "$!" };
$time ? $time->($self) : $self->_error(0, $error);
return if not exists $self->{$timeout};
}
Scalar::Util::weaken($self);
return if not $self;
$self->{$timer} = AE::timer($after, 0, sub {
delete $self->{$timer};
$callback->($self);
});
};
_insert($timeout, sub {
my $self = shift;
if (@_) {
my $value = shift;
$self->{$timeout} = $value;
if ($value == 0) {
delete $self->{$timer};
delete $self->{$timeout};
return;
}
else {
$callback->($self);
}
}
return $self->{$timeout};
});
( run in 1.030 second using v1.01-cache-2.11-cpan-49f99fa48dc )