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