summaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2012-04-24 04:01:28 +0200
committerBen Noordhuis <info@bnoordhuis.nl>2012-04-24 04:11:29 +0200
commit48cdbffd24f7357b997e96b6ed4e5d27a999d9dd (patch)
tree280a1f5d7ba111eac14b2c412e9466ca9e1d81e8 /deps
parentebfb8a5613b2e7f5961644cc24ca023d2ca73255 (diff)
downloadnode-48cdbffd24f7357b997e96b6ed4e5d27a999d9dd.tar.gz
v8: posix: try to send() whole buffer
Retry the send() syscall after a partial write.
Diffstat (limited to 'deps')
-rw-r--r--deps/v8/src/platform-posix.cc21
1 files changed, 15 insertions, 6 deletions
diff --git a/deps/v8/src/platform-posix.cc b/deps/v8/src/platform-posix.cc
index 9c574937b..1f87e7097 100644
--- a/deps/v8/src/platform-posix.cc
+++ b/deps/v8/src/platform-posix.cc
@@ -472,13 +472,22 @@ bool POSIXSocket::Shutdown() {
int POSIXSocket::Send(const char* data, int len) const {
- int status;
-
- do
- status = send(socket_, data, len, 0);
- while (status == -1 && errno == EINTR);
+ int written;
+
+ for (written = 0; written < len; /* empty */) {
+ int status = send(socket_, data + written, len - written, 0);
+ if (status == 0) {
+ break;
+ } else if (status > 0) {
+ written += status;
+ } else if (errno == EINTR) {
+ /* interrupted by signal, retry */
+ } else {
+ return -1;
+ }
+ }
- return status;
+ return written;
}