X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine.pm;h=9b59c7dfbc00f17ff7aabfad0ee4808427ee0cc4;hb=e2b0ddd34989844e13aa57483888973068d62dbe;hp=089a9595412c230c9a2e051392945328c51c7b8a;hpb=7d22a5373b8e3c57c1c6a9cae3d246efb840a8ea;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine.pm b/lib/Catalyst/Engine.pm index 089a959..9b59c7d 100644 --- a/lib/Catalyst/Engine.pm +++ b/lib/Catalyst/Engine.pm @@ -4,10 +4,10 @@ use strict; use base 'Class::Accessor::Fast'; use CGI::Simple::Cookie; use Data::Dump qw/dump/; -use Errno 'EWOULDBLOCK'; use HTML::Entities; use HTTP::Body; use HTTP::Headers; +use IO::Select (); use URI::QueryParam; use Scalar::Util (); @@ -622,30 +622,29 @@ sub write { $self->{_prepared_write} = 1; } - my $len = length($buffer); - my $wrote = syswrite STDOUT, $buffer; + my $wrote; + my $len = length($buffer); - if ( !defined $wrote && $! == EWOULDBLOCK ) { - # Unable to write on the first try, will retry in the loop below - $wrote = 0; - } + my $sel = IO::Select->new(); + $sel->add( \*STDOUT ); - if ( defined $wrote && $wrote < $len ) { - # We didn't write the whole buffer - while (1) { - my $ret = syswrite STDOUT, $buffer, $CHUNKSIZE, $wrote; - if ( defined $ret ) { - $wrote += $ret; - } - else { - next if $! == EWOULDBLOCK; - return; - } - - last if $wrote >= $len; + while ( $sel->can_write() ) { + $wrote ||= 0; + + my $ret = syswrite STDOUT, $buffer, $CHUNKSIZE, $wrote; + if ( defined $ret ) { + $wrote += $ret; } + else { + # Write error + return; + } + + last if $wrote >= $len; } + $sel->remove( \*STDOUT ); + return $wrote; }