diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2012-04-24 04:01:28 +0200 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2012-04-24 04:11:29 +0200 |
commit | 48cdbffd24f7357b997e96b6ed4e5d27a999d9dd (patch) | |
tree | 280a1f5d7ba111eac14b2c412e9466ca9e1d81e8 /deps | |
parent | ebfb8a5613b2e7f5961644cc24ca023d2ca73255 (diff) | |
download | node-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.cc | 21 |
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; } |