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.31 by root, Sun Aug 21 03:02:33 2011 UTC vs.
Revision 1.32 by root, Thu Sep 1 04:07:18 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 Fcntl ();
28 29
29use AnyEvent (); BEGIN { AnyEvent::common_sense } 30use AnyEvent (); BEGIN { AnyEvent::common_sense }
30 31
31AnyEvent::_isa_hook 1 => "AnyEvent::Strict", 1; 32AnyEvent::_isa_hook 1 => "AnyEvent::Strict", 1;
32 33
61 } 62 }
62 }; 63 };
63 } 64 }
64} 65}
65 66
67our (@FD_INUSE, @FD_FH, $FD_I);
68our $FD_CHECK_W = AE::timer 4, 4, sub {
69 my $cnt = (@FD_INUSE < 100 * 10 ? int @FD_INUSE * 0.1 : 100) || 1;
70
71 if ($FD_I <= 0) {
72 #pop @FD_INUSE while @FD_INUSE && !$FD_INUSE[-1]; # also $FD_FH
73 ($FD_I = @FD_INUSE) >= 0
74 or return; # empty
75 }
76
77 $cnt = $FD_I + 1 if $cnt > $FD_I;
78
79 eval {
80 do {
81 !$FD_FH[--$FD_I]
82 or fcntl $FD_FH[$FD_I], Fcntl::F_GETFL(), 0
83 or die;
84 } while --$cnt;
85 1
86 } or AE::log crit => "file descriptor $FD_I registered with AnyEvent but prematurely closed, event loop might malfunction.\n";
87};
88
66sub io { 89sub io {
67 my $class = shift; 90 my $class = shift;
68 my %arg = @_; 91 my (%arg, $fh, $cb) = @_;
69 92
70 ref $arg{cb} 93 ref $arg{cb}
71 or croak "AnyEvent->io called with illegal cb argument '$arg{cb}'"; 94 or croak "AnyEvent->io called with illegal cb argument '$arg{cb}'";
72 my $cb = wrap delete $arg{cb}; 95 $cb = wrap delete $arg{cb};
73 96
74 $arg{poll} =~ /^[rw]$/ 97 $arg{poll} =~ /^[rw]$/
75 or croak "AnyEvent->io called with illegal poll argument '$arg{poll}'"; 98 or croak "AnyEvent->io called with illegal poll argument '$arg{poll}'";
76 99
100 $fh = delete $arg{fh};
101
77 if ($arg{fh} =~ /^\s*\d+\s*$/) { 102 if ($fh =~ /^\s*\d+\s*$/) {
78 $arg{fh} = AnyEvent::_dupfh $arg{poll}, $arg{fh}; 103 $fh = AnyEvent::_dupfh $arg{poll}, $fh;
79 } else { 104 } else {
80 defined eval { fileno $arg{fh} } 105 defined eval { fileno $fh }
81 or croak "AnyEvent->io called with illegal fh argument '$arg{fh}'"; 106 or croak "AnyEvent->io called with illegal fh argument '$fh'";
82 } 107 }
83 108
84 -f $arg{fh} 109 -f $fh
85 and croak "AnyEvent->io called with fh argument pointing to a file"; 110 and croak "AnyEvent->io called with fh argument pointing to a file";
86 111
87 delete $arg{poll}; 112 delete $arg{poll};
88 delete $arg{fh};
89 113
90 croak "AnyEvent->io called with unsupported parameter(s) " . join ", ", keys %arg 114 croak "AnyEvent->io called with unsupported parameter(s) " . join ", ", keys %arg
91 if keys %arg; 115 if keys %arg;
92 116
117 ++$FD_INUSE[fileno $fh];
118 $FD_FH[fileno $$fh] = $fh;
119
120 bless [
121 fileno $fh,
93 $class->SUPER::io (@_, cb => $cb) 122 $class->SUPER::io (@_, cb => $cb)
123 ], "AnyEvent::Strict::io";
124}
125
126sub AnyEvent::Strict::io::DESTROY {
127 --$FD_INUSE[$_[0][0]]
128 or delete $FD_FH[$_[0][0]];
94} 129}
95 130
96sub timer { 131sub timer {
97 my $class = shift; 132 my $class = shift;
98 my %arg = @_; 133 my %arg = @_;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines