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

Comparing AnyEvent/lib/AnyEvent/Handle.pm (file contents):
Revision 1.79 by root, Sun Jul 27 08:37:56 2008 UTC vs.
Revision 1.82 by root, Thu Aug 21 18:45:16 2008 UTC

14 14
15AnyEvent::Handle - non-blocking I/O on file handles via AnyEvent 15AnyEvent::Handle - non-blocking I/O on file handles via AnyEvent
16 16
17=cut 17=cut
18 18
19our $VERSION = 4.22; 19our $VERSION = 4.232;
20 20
21=head1 SYNOPSIS 21=head1 SYNOPSIS
22 22
23 use AnyEvent; 23 use AnyEvent;
24 use AnyEvent::Handle; 24 use AnyEvent::Handle;
79 79
80Set the callback to be called when an end-of-file condition is detected, 80Set the callback to be called when an end-of-file condition is detected,
81i.e. in the case of a socket, when the other side has closed the 81i.e. in the case of a socket, when the other side has closed the
82connection cleanly. 82connection cleanly.
83 83
84For sockets, this just means that the other side has stopped sending data,
85you can still try to write data, and, in fact, one can return from the eof
86callback and continue writing data, as only the read part has been shut
87down.
88
84While not mandatory, it is highly recommended to set an eof callback, 89While not mandatory, it is I<highly> recommended to set an eof callback,
85otherwise you might end up with a closed socket while you are still 90otherwise you might end up with a closed socket while you are still
86waiting for data. 91waiting for data.
92
93If an EOF condition has been detected but no C<on_eof> callback has been
94set, then a fatal error will be raised with C<$!> set to <0>.
87 95
88=item on_error => $cb->($handle, $fatal) 96=item on_error => $cb->($handle, $fatal)
89 97
90This is the error callback, which is called when, well, some error 98This is the error callback, which is called when, well, some error
91occured, such as not being able to resolve the hostname, failure to 99occured, such as not being able to resolve the hostname, failure to
92connect or a read error. 100connect or a read error.
93 101
94Some errors are fatal (which is indicated by C<$fatal> being true). On 102Some errors are fatal (which is indicated by C<$fatal> being true). On
95fatal errors the handle object will be shut down and will not be 103fatal errors the handle object will be shut down and will not be usable
104(but you are free to look at the current C< ->rbuf >). Examples of fatal
105errors are an EOF condition with active (but unsatisifable) read watchers
106(C<EPIPE>) or I/O errors.
107
96usable. Non-fatal errors can be retried by simply returning, but it is 108Non-fatal errors can be retried by simply returning, but it is recommended
97recommended to simply ignore this parameter and instead abondon the handle 109to simply ignore this parameter and instead abondon the handle object
98object when this callback is invoked. 110when this callback is invoked. Examples of non-fatal errors are timeouts
111C<ETIMEDOUT>) or badly-formatted data (C<EBADMSG>).
99 112
100On callback entrance, the value of C<$!> contains the operating system 113On callback entrance, the value of C<$!> contains the operating system
101error (or C<ENOSPC>, C<EPIPE>, C<ETIMEDOUT> or C<EBADMSG>). 114error (or C<ENOSPC>, C<EPIPE>, C<ETIMEDOUT> or C<EBADMSG>).
102 115
103While not mandatory, it is I<highly> recommended to set this callback, as 116While not mandatory, it is I<highly> recommended to set this callback, as
288 delete $self->{_rw}; 301 delete $self->{_rw};
289 delete $self->{_ww}; 302 delete $self->{_ww};
290 delete $self->{fh}; 303 delete $self->{fh};
291 304
292 $self->stoptls; 305 $self->stoptls;
306
307 delete $self->{on_read};
308 delete $self->{_queue};
293} 309}
294 310
295sub _error { 311sub _error {
296 my ($self, $errno, $fatal) = @_; 312 my ($self, $errno, $fatal) = @_;
297 313
726 742
727 if ( 743 if (
728 defined $self->{rbuf_max} 744 defined $self->{rbuf_max}
729 && $self->{rbuf_max} < length $self->{rbuf} 745 && $self->{rbuf_max} < length $self->{rbuf}
730 ) { 746 ) {
731 return $self->_error (&Errno::ENOSPC, 1); 747 $self->_error (&Errno::ENOSPC, 1), return;
732 } 748 }
733 749
734 while () { 750 while () {
735 my $len = length $self->{rbuf}; 751 my $len = length $self->{rbuf};
736 752
737 if (my $cb = shift @{ $self->{_queue} }) { 753 if (my $cb = shift @{ $self->{_queue} }) {
738 unless ($cb->($self)) { 754 unless ($cb->($self)) {
739 if ($self->{_eof}) { 755 if ($self->{_eof}) {
740 # no progress can be made (not enough data and no data forthcoming) 756 # no progress can be made (not enough data and no data forthcoming)
741 $self->_error (&Errno::EPIPE, 1), last; 757 $self->_error (&Errno::EPIPE, 1), return;
742 } 758 }
743 759
744 unshift @{ $self->{_queue} }, $cb; 760 unshift @{ $self->{_queue} }, $cb;
745 last; 761 last;
746 } 762 }
754 && !@{ $self->{_queue} } # and the queue is still empty 770 && !@{ $self->{_queue} } # and the queue is still empty
755 && $self->{on_read} # but we still have on_read 771 && $self->{on_read} # but we still have on_read
756 ) { 772 ) {
757 # no further data will arrive 773 # no further data will arrive
758 # so no progress can be made 774 # so no progress can be made
759 $self->_error (&Errno::EPIPE, 1), last 775 $self->_error (&Errno::EPIPE, 1), return
760 if $self->{_eof}; 776 if $self->{_eof};
761 777
762 last; # more data might arrive 778 last; # more data might arrive
763 } 779 }
764 } else { 780 } else {
766 delete $self->{_rw}; 782 delete $self->{_rw};
767 last; 783 last;
768 } 784 }
769 } 785 }
770 786
787 if ($self->{_eof}) {
788 if ($self->{on_eof}) {
771 $self->{on_eof}($self) 789 $self->{on_eof}($self)
772 if $self->{_eof} && $self->{on_eof}; 790 } else {
791 $self->_error (0, 1);
792 }
793 }
773 794
774 # may need to restart read watcher 795 # may need to restart read watcher
775 unless ($self->{_rw}) { 796 unless ($self->{_rw}) {
776 $self->start_read 797 $self->start_read
777 if $self->{on_read} || @{ $self->{_queue} }; 798 if $self->{on_read} || @{ $self->{_queue} };

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines