Francois Gouget : testbot/TestAgent: Fix handling of EAGAIN errors in _SendFile().

Alexandre Julliard julliard at winehq.org
Fri Jan 25 13:17:35 CST 2013


Module: tools
Branch: master
Commit: 070fa93c111a22903b8c0403643f0a8e17524603
URL:    http://source.winehq.org/git/tools.git/?a=commit;h=070fa93c111a22903b8c0403643f0a8e17524603

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Fri Jan 25 14:48:26 2013 +0100

testbot/TestAgent: Fix handling of EAGAIN errors in _SendFile().

We can get EAGAIN errors when tunneling through SSH, particularly for larger $BLOCK_SIZE values.

---

 testbot/lib/WineTestBot/TestAgent.pm |   54 +++++++++++++++++++--------------
 1 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/testbot/lib/WineTestBot/TestAgent.pm b/testbot/lib/WineTestBot/TestAgent.pm
index 6b8bff7..f06bd71 100644
--- a/testbot/lib/WineTestBot/TestAgent.pm
+++ b/testbot/lib/WineTestBot/TestAgent.pm
@@ -556,6 +556,32 @@ sub _RecvErrorList($)
 # Low-level functions to send raw data
 #
 
+sub _Write($$)
+{
+  my ($self, $Data) = @_;
+  return undef if (!defined $self->{fd});
+
+  my $Size = length($Data);
+  my $Sent = 0;
+  while ($Size)
+  {
+    my $w = syswrite($self->{fd}, $Data, $Size, $Sent);
+    if (!defined $w)
+    {
+      $self->_SetError($FATAL, "network write error: $!");
+      return undef;
+    }
+    if ($w == 0)
+    {
+      $self->_SetError($FATAL, "unable to send more data");
+      return $Sent;
+    }
+    $Sent += $w;
+    $Size -= $w;
+  }
+  return $Sent;
+}
+
 sub _SendRawData($$)
 {
   my ($self, $Data) = @_;
@@ -566,29 +592,11 @@ sub _SendRawData($$)
   {
     local $SIG{ALRM} = sub { die "timeout" };
     $self->_SetAlarm();
-
-    my $Size = length($Data);
-    my $Pos = 0;
-    while ($Size)
-    {
-      my $n = syswrite($self->{fd}, $Data, $Size, $Pos);
-      if (!defined $n)
-      {
-        alarm(0);
-        $self->_SetError($FATAL, "network write error: $!");
-        return;
-      }
-      if ($n == 0)
-      {
-        alarm(0);
-        $self->_SetError($FATAL, "unable to send more data");
-        return;
-      }
-      $Pos += $n;
-      $Size -= $n;
-    }
+    $self->_Write($Data);
     alarm(0);
-    $Success = 1;
+
+    # _Write() errors are fatal and break the connection
+    $Success = 1 if (defined $self->{fd});
   };
   if ($@)
   {
@@ -694,7 +702,7 @@ sub _SendFile($$$)
         return;
       }
       $Size -= $r;
-      my $w = syswrite($self->{fd}, $Buffer, $r, 0);
+      my $w = $self->_Write($Buffer);
       if (!defined $w or $w != $r)
       {
         alarm(0);




More information about the wine-cvs mailing list