ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Strict.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent/Strict.pm (file contents):
Revision 1.27 by root, Sun Aug 14 22:35:22 2011 UTC vs.
Revision 1.35 by root, Fri Sep 2 04:35:03 2011 UTC

23=cut 23=cut
24 24
25package AnyEvent::Strict; 25package AnyEvent::Strict;
26 26
27use Carp qw(croak); 27use Carp qw(croak);
28use Errno ();
29use POSIX ();
28 30
29use AnyEvent (); BEGIN { AnyEvent::common_sense } 31use AnyEvent (); BEGIN { AnyEvent::common_sense }
30 32
31AnyEvent::_isa_hook 0 => "AnyEvent::Strict", 1; 33AnyEvent::_isa_hook 1 => "AnyEvent::Strict", 1;
32 34
33my $magic = []; 35BEGIN {
34 36 if (defined &Internals::SvREADONLY) {
35sub wrap { 37 # readonly available (at least 5.8.9+, working better in 5.10.1+)
38 *wrap = sub {
36 my $cb = shift; 39 my $cb = shift;
37 40
38 sub { 41 sub {
42 Internals::SvREADONLY $_, 1;
43 &$cb;
44 Internals::SvREADONLY $_, 0;
45 }
46 };
47 } else {
48 # or not :/
49 my $magic = []; # a unique magic value
50
51 *wrap = sub {
52 my $cb = shift;
53
54 sub {
39 local $_ = $magic; 55 local $_ = $magic;
40 56
41 &$cb; 57 &$cb;
42 58
43 if (!ref $_ || $_ != $magic) { 59 if (!ref $_ || $_ != $magic) {
44 require AnyEvent::Debug; 60 require AnyEvent::Debug;
45 die "callback $cb (" . AnyEvent::Debug::cb2str ($cb) . ") modified \$_ without restoring it.\n"; 61 die "callback $cb (" . AnyEvent::Debug::cb2str ($cb) . ") modified \$_ without restoring it.\n";
62 }
63 }
46 } 64 };
47 } 65 }
48} 66}
49 67
68our (@FD_INUSE, $FD_I);
69our $FD_CHECK_W = AE::timer 4, 4, sub {
70 my $cnt = (@FD_INUSE < 100 * 10 ? int @FD_INUSE * 0.1 : 100) || 10;
71
72 if ($FD_I <= 0) {
73 #pop @FD_INUSE while @FD_INUSE && !$FD_INUSE[-1];
74 ($FD_I = @FD_INUSE) >= 0
75 or return; # empty
76 }
77
78 $cnt = $FD_I if $cnt > $FD_I;
79
80 eval {
81 do {
82 !$FD_INUSE[--$FD_I]
83 or (POSIX::lseek $FD_I, 0, 1) != -1
84 or $! != Errno::EBADF
85 or die;
86 } while --$cnt;
87 1
88 } or AE::log crit => "file descriptor $FD_I registered with AnyEvent but prematurely closed, event loop might malfunction.\n";
89};
90
50sub io { 91sub io {
51 my $class = shift; 92 my $class = shift;
52 my %arg = @_; 93 my (%arg, $fh, $cb, $fd) = @_;
53 94
54 ref $arg{cb} 95 ref $arg{cb}
55 or croak "AnyEvent->io called with illegal cb argument '$arg{cb}'"; 96 or croak "AnyEvent->io called with illegal cb argument '$arg{cb}'";
56 my $cb = wrap delete $arg{cb}; 97 $cb = wrap delete $arg{cb};
57 98
58 $arg{poll} =~ /^[rw]$/ 99 $arg{poll} =~ /^[rw]$/
59 or croak "AnyEvent->io called with illegal poll argument '$arg{poll}'"; 100 or croak "AnyEvent->io called with illegal poll argument '$arg{poll}'";
60 101
102 $fh = delete $arg{fh};
103
61 if ($arg{fh} =~ /^\s*\d+\s*$/) { 104 if ($fh =~ /^\s*\d+\s*$/) {
105 $fd = $fh;
62 $arg{fh} = AnyEvent::_dupfh $arg{poll}, $arg{fh}; 106 $fh = AnyEvent::_dupfh $arg{poll}, $fh;
63 } else { 107 } else {
64 defined eval { fileno $arg{fh} } 108 defined eval { $fd = fileno $fh }
65 or croak "AnyEvent->io called with illegal fh argument '$arg{fh}'"; 109 or croak "AnyEvent->io called with illegal fh argument '$fh'";
66 } 110 }
67 111
68 -f $arg{fh} 112 -f $fh
69 and croak "AnyEvent->io called with fh argument pointing to a file"; 113 and croak "AnyEvent->io called with fh argument pointing to a file";
70 114
71 delete $arg{poll}; 115 delete $arg{poll};
72 delete $arg{fh};
73 116
74 croak "AnyEvent->io called with unsupported parameter(s) " . join ", ", keys %arg 117 croak "AnyEvent->io called with unsupported parameter(s) " . join ", ", keys %arg
75 if keys %arg; 118 if keys %arg;
76 119
120 ++$FD_INUSE[$fd];
121
122 bless [
123 $fd,
77 $class->SUPER::io (@_, cb => $cb) 124 $class->SUPER::io (@_, cb => $cb)
125 ], "AnyEvent::Strict::io";
126}
127
128sub AnyEvent::Strict::io::DESTROY {
129 --$FD_INUSE[$_[0][0]];
78} 130}
79 131
80sub timer { 132sub timer {
81 my $class = shift; 133 my $class = shift;
82 my %arg = @_; 134 my %arg = @_;
158 my @cb = exists $arg{cb} ? (cb => wrap delete $arg{cb}) : (); 210 my @cb = exists $arg{cb} ? (cb => wrap delete $arg{cb}) : ();
159 211
160 croak "AnyEvent->condvar called with unsupported parameter(s) " . join ", ", keys %arg 212 croak "AnyEvent->condvar called with unsupported parameter(s) " . join ", ", keys %arg
161 if keys %arg; 213 if keys %arg;
162 214
163 $class->SUPER::condvar (@_, @cb); 215 $class->SUPER::condvar (@cb);
164} 216}
165 217
166sub time { 218sub time {
167 my $class = shift; 219 my $class = shift;
168 220

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines