Reviewers: Yang,

Message:
LGTM.

Description:
Handle EINTR in socket functions and continue incomplete sends.

Based on a patch by Ben Noordhuis <[email protected]>.

BUG=v8:2098
TEST=


Please review this at http://codereview.chromium.org/10416006/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/platform-posix.cc
  M src/platform-win32.cc


Index: src/platform-posix.cc
diff --git a/src/platform-posix.cc b/src/platform-posix.cc
index 3e143d2f6441f78929c4784384e20fbfca85b47b..d942d78a55760ef1c178aaac004100a040d48006 100644
--- a/src/platform-posix.cc
+++ b/src/platform-posix.cc
@@ -421,7 +421,11 @@ Socket* POSIXSocket::Accept() const {
     return NULL;
   }

-  int socket = accept(socket_, NULL, NULL);
+  int socket;
+  do {
+    socket = accept(socket_, NULL, NULL);
+  } while (socket == -1 && errno == EINTR);
+
   if (socket == -1) {
     return NULL;
   } else {
@@ -448,7 +452,9 @@ bool POSIXSocket::Connect(const char* host, const char* port) {
   }

   // Connect.
-  status = connect(socket_, result->ai_addr, result->ai_addrlen);
+  do {
+    status = connect(socket_, result->ai_addr, result->ai_addrlen);
+  } while (status == -1 && errno == EINTR);
   freeaddrinfo(result);
   return status == 0;
 }
@@ -468,14 +474,27 @@ bool POSIXSocket::Shutdown() {

 int POSIXSocket::Send(const char* data, int len) const {
   if (len <= 0) return 0;
-  int status = send(socket_, data, len, 0);
-  return (status < 0) ? 0 : status;
+  int written = 0;
+  while (written < len) {
+    int status = send(socket_, data + written, len - written, 0);
+    if (status == 0) {
+      break;
+    } else if (status > 0) {
+      written += status;
+    } else if (errno != EINTR) {
+      return 0;
+    }
+  }
+  return written;
 }


 int POSIXSocket::Receive(char* data, int len) const {
   if (len <= 0) return 0;
-  int status = recv(socket_, data, len, 0);
+  int status;
+  do {
+    status = recv(socket_, data, len, 0);
+  } while (status == -1 && errno == EINTR);
   return (status < 0) ? 0 : status;
 }

Index: src/platform-win32.cc
diff --git a/src/platform-win32.cc b/src/platform-win32.cc
index aa2a71af54f8a29b97d0084afb19e901a03a0639..2473949dec583e6e5ae85799f42df8f60dbae790 100644
--- a/src/platform-win32.cc
+++ b/src/platform-win32.cc
@@ -1849,8 +1849,18 @@ bool Win32Socket::Shutdown() {

 int Win32Socket::Send(const char* data, int len) const {
   if (len <= 0) return 0;
-  int status = send(socket_, data, len, 0);
-  return (status == SOCKET_ERROR) ? 0 : status;
+  int written = 0;
+  while (written < len) {
+    int status = send(socket_, data + written, len - written, 0);
+    if (status == 0) {
+      break;
+    } else if (status > 0) {
+      written += status;
+    } else {
+      return 0;
+    }
+  }
+  return written;
 }




--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to