AnyEvent
view release on metacpan or search on metacpan
lib/AnyEvent/Strict.pm view on Meta::CPAN
=head1 NAME
AnyEvent::Strict - force strict mode on for the whole process
=head1 SYNOPSIS
use AnyEvent::Strict;
# strict mode now switched on
=head1 DESCRIPTION
This module implements AnyEvent's strict mode.
Loading it makes AnyEvent check all arguments to AnyEvent-methods, at the
expense of being slower (often the argument checking takes longer than the
actual function). It also wraps all callbacks to check for modifications
of C<$_>, which indicates a programming bug inside the watcher callback.
Normally, you don't load this module yourself but instead use it
indirectly via the C<PERL_ANYEVENT_STRICT> environment variable (see
L<AnyEvent>). However, this module can be loaded manually at any time.
=cut
package AnyEvent::Strict;
use Carp qw(confess);
use Errno ();
use POSIX ();
$Carp::Internal{AE} = 1;
$Carp::Internal{AnyEvent::Strict} = 1;
use AnyEvent (); BEGIN { AnyEvent::common_sense }
AnyEvent::_isa_hook 1 => "AnyEvent::Strict", 1;
BEGIN {
if (defined &Internals::SvREADONLY) {
# readonly available (at least 5.8.9+, working better in 5.10.1+)
*wrap = sub {
my $cb = shift;
sub {
local $_;
Internals::SvREADONLY $_, 1;
&$cb;
}
};
} else {
# or not :/
my $magic = []; # a unique magic value
*wrap = sub {
my $cb = shift;
sub {
local $_ = $magic;
&$cb;
if (!ref $_ || $_ != $magic) {
require AnyEvent::Debug;
die "callback $cb (" . AnyEvent::Debug::cb2str ($cb) . ") modified \$_ without restoring it.\n";
}
}
};
}
}
our (@FD_INUSE, $FD_I);
our $FD_CHECK_W = AE::timer 4, 4, sub {
my $cnt = (@FD_INUSE < 100 * 10 ? int @FD_INUSE * 0.1 : 100) || 10;
if ($FD_I <= 0) {
#pop @FD_INUSE while @FD_INUSE && !$FD_INUSE[-1];
( run in 1.271 second using v1.01-cache-2.11-cpan-39bf76dae61 )