--- AnyEvent/lib/AnyEvent/Handle.pm 2008/06/04 09:55:16 1.56 +++ AnyEvent/lib/AnyEvent/Handle.pm 2008/06/05 18:30:08 1.60 @@ -16,7 +16,7 @@ =cut -our $VERSION = 4.12; +our $VERSION = 4.14; =head1 SYNOPSIS @@ -226,15 +226,11 @@ $self->starttls (delete $self->{tls}, delete $self->{tls_ctx}); } -# $self->on_eof (delete $self->{on_eof} ) if $self->{on_eof}; # nop -# $self->on_error (delete $self->{on_error}) if $self->{on_error}; # nop -# $self->on_read (delete $self->{on_read} ) if $self->{on_read}; # nop - $self->on_drain (delete $self->{on_drain}) if $self->{on_drain}; - $self->{_activity} = AnyEvent->now; $self->_timeout; - $self->start_read; + $self->on_drain (delete $self->{on_drain}) if $self->{on_drain}; + $self->on_read (delete $self->{on_read} ) if $self->{on_read}; $self } @@ -622,6 +618,8 @@ sub _drain_rbuf { my ($self) = @_; + local $self->{_in_drain} = 1; + if ( defined $self->{rbuf_max} && $self->{rbuf_max} < length $self->{rbuf} @@ -629,11 +627,11 @@ return $self->_error (&Errno::ENOSPC, 1); } - return if $self->{in_drain}; - local $self->{in_drain} = 1; - - while (my $len = length $self->{rbuf}) { + while () { no strict 'refs'; + + my $len = length $self->{rbuf}; + if (my $cb = shift @{ $self->{_queue} }) { unless ($cb->($self)) { if ($self->{_eof}) { @@ -688,6 +686,7 @@ my ($self, $cb) = @_; $self->{on_read} = $cb; + $self->_drain_rbuf if $cb && !$self->{_in_drain}; } =item $handle->rbuf @@ -746,7 +745,7 @@ } push @{ $self->{_queue} }, $cb; - $self->_drain_rbuf; + $self->_drain_rbuf unless $self->{_in_drain}; } sub unshift_read { @@ -762,7 +761,7 @@ unshift @{ $self->{_queue} }, $cb; - $self->_drain_rbuf; + $self->_drain_rbuf unless $self->{_in_drain}; } =item $handle->push_read (type => @args, $cb) @@ -1035,7 +1034,7 @@ =item $handle->start_read In rare cases you actually do not want to read anything from the -socket. In this case you can call C. Neither C no +socket. In this case you can call C. Neither C nor any queued callbacks will be executed then. To start reading again, call C. @@ -1067,12 +1066,12 @@ $self->{filter_r} ? $self->{filter_r}($self, $rbuf) - : $self->_drain_rbuf; + : $self->{_in_drain} || $self->_drain_rbuf; } elsif (defined $len) { delete $self->{_rw}; $self->{_eof} = 1; - $self->_drain_rbuf; + $self->_drain_rbuf unless $self->{_in_drain}; } elsif ($! != EAGAIN && $! != EINTR && $! != WSAEWOULDBLOCK) { return $self->_error ($!, 1); @@ -1100,7 +1099,7 @@ while (defined ($buf = Net::SSLeay::read ($self->{tls}))) { if (length $buf) { $self->{rbuf} .= $buf; - $self->_drain_rbuf; + $self->_drain_rbuf unless $self->{_in_drain}; } else { # let's treat SSL-eof as we treat normal EOF $self->{_eof} = 1;