AnyEvent-SNMP
view release on metacpan or search on metacpan
return;
}
# Actually send the message.
if (!defined $msg->send) {
$MESSAGE_PROCESSING->msg_handle_delete ($pdu->msg_id)
if $pdu->expect_response;
# A crude attempt to recover from temporary failures.
if ($retries-- > 0 && ($!{EAGAIN} || $!{EWOULDBLOCK} || $!{ENOSPC})) {
my $retry_w; $retry_w = AE::timer $pdu->timeout, 0, sub {
undef $retry_w;
_send_pdu ($pdu, $retries);
};
} else {
--$BUSY;
kick_job;
}
# Inform the command generator about the send() error.
$pdu->status_information ($msg->error);
}
# when we end up here, we successfully handled $MAX_RECVQUEUE
# replies in one iteration, so assume we are overloaded
# and reduce the amount of parallelity.
$MAX_OUTSTANDING = (int $MAX_OUTSTANDING * 0.95) || 1;
};
}
$msg->timeout_id (\(my $rtimeout_w =
AE::timer $pdu->timeout, 0, sub {
my $rtimeout_w = $msg->timeout_id;
if ($$rtimeout_w) {
undef $$rtimeout_w;
delete $TRANSPORT[$fileno]
unless --$TRANSPORT[$fileno][0];
}
if ($retries--) {
_send_pdu ($pdu, $retries);
} else {
$DONE and $DONE->() unless $BUSY;
}
sub send_pdu($$$) {
my (undef, $pdu, $delay) = @_;
# $delay is not very sensibly implemented by AnyEvent::SNMP,
# but apparently it is not a very sensible feature.
if ($delay > 0) {
++$BUSY;
my $delay_w; $delay_w = AE::timer $delay, 0, sub {
undef $delay_w;
push @QUEUE, $pdu;
--$BUSY;
kick_job;
};
return 1;
}
push @QUEUE, $pdu;
kick_job;
( run in 0.951 second using v1.01-cache-2.11-cpan-49f99fa48dc )