Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(358)

Unified Diff: runtime/bin/socket_macos.cc

Issue 9139011: Handle EINTR on all IO operations (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fixed building on Mac OS Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/socket_linux.cc ('k') | runtime/platform/globals.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/socket_macos.cc
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index c75cc454b76fb1a10625cc0f1c59987b3ed6ac6e..0e4acd0f85076fc025370dc94d477167233c9dd6 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
@@ -26,7 +26,7 @@ intptr_t Socket::CreateConnect(const char* host, const intptr_t port) {
struct hostent* server;
struct sockaddr_in server_address;
- fd = socket(AF_INET, SOCK_STREAM, 0);
+ fd = TEMP_FAILURE_RETRY(socket(AF_INET, SOCK_STREAM, 0));
if (fd < 0) {
fprintf(stderr, "Error CreateConnect: %s\n", strerror(errno));
return -1;
@@ -36,7 +36,7 @@ intptr_t Socket::CreateConnect(const char* host, const intptr_t port) {
server = gethostbyname(host);
if (server == NULL) {
- close(fd);
+ TEMP_FAILURE_RETRY(close(fd));
fprintf(stderr, "Error CreateConnect: %s\n", strerror(errno));
return -1;
}
@@ -45,9 +45,10 @@ intptr_t Socket::CreateConnect(const char* host, const intptr_t port) {
server_address.sin_port = htons(port);
bcopy(server->h_addr, &server_address.sin_addr.s_addr, server->h_length);
memset(&server_address.sin_zero, 0, sizeof(server_address.sin_zero));
- intptr_t result = connect(fd,
- reinterpret_cast<struct sockaddr *>(&server_address),
- sizeof(server_address));
+ intptr_t result = TEMP_FAILURE_RETRY(
+ connect(fd,
+ reinterpret_cast<struct sockaddr *>(&server_address),
+ sizeof(server_address)));
if (result == 0 || errno == EINPROGRESS) {
return fd;
}
@@ -62,11 +63,11 @@ intptr_t Socket::Available(intptr_t fd) {
int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
ASSERT(fd >= 0);
- ssize_t read_bytes = read(fd, buffer, num_bytes);
- if (read_bytes == -1 &&
- (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)) {
- // If the read was interrupted or the read would block we need
- // to retry and therefore return 0 as the number of bytes written.
+ ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
+ ASSERT(EAGAIN == EWOULDBLOCK);
+ if (read_bytes == -1 && errno == EWOULDBLOCK) {
+ // If the read would block we need to retry and therefore return 0
+ // as the number of bytes written.
read_bytes = 0;
}
return read_bytes;
@@ -75,11 +76,11 @@ int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
ASSERT(fd >= 0);
- ssize_t written_bytes = write(fd, buffer, num_bytes);
- if (written_bytes == -1 &&
- (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)) {
- // If the write was interrupted or the write would block we need
- // to retry and therefore return 0 as the number of bytes written.
+ ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
+ ASSERT(EAGAIN == EWOULDBLOCK);
+ if (written_bytes == -1 && errno == EWOULDBLOCK) {
+ // If the would block we need to retry and therefore return 0 as
+ // the number of bytes written.
written_bytes = 0;
}
return written_bytes;
@@ -90,8 +91,10 @@ intptr_t Socket::GetPort(intptr_t fd) {
ASSERT(fd >= 0);
struct sockaddr_in socket_address;
socklen_t size = sizeof(socket_address);
- if (getsockname(fd, reinterpret_cast<struct sockaddr *>(&socket_address),
- &size)) {
+ if (TEMP_FAILURE_RETRY(
+ getsockname(fd,
+ reinterpret_cast<struct sockaddr *>(&socket_address),
+ &size))) {
fprintf(stderr, "Error getsockname: %s\n", strerror(errno));
return 0;
}
@@ -105,33 +108,36 @@ intptr_t Socket::GetStdioHandle(int num) {
intptr_t ServerSocket::CreateBindListen(const char* host,
- intptr_t port,
- intptr_t backlog) {
+ intptr_t port,
+ intptr_t backlog) {
intptr_t fd;
struct sockaddr_in server_address;
- fd = socket(AF_INET, SOCK_STREAM, 0);
+ fd = TEMP_FAILURE_RETRY(socket(AF_INET, SOCK_STREAM, 0));
if (fd < 0) {
fprintf(stderr, "Error CreateBind: %s\n", strerror(errno));
return -1;
}
int optval = 1;
- setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
+ TEMP_FAILURE_RETRY(
+ setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(port);
server_address.sin_addr.s_addr = inet_addr(host);
memset(&server_address.sin_zero, 0, sizeof(server_address.sin_zero));
- if (bind(fd, reinterpret_cast<struct sockaddr *>(&server_address),
- sizeof(server_address)) < 0) {
- close(fd);
+ if (TEMP_FAILURE_RETRY(
+ bind(fd,
+ reinterpret_cast<struct sockaddr *>(&server_address),
+ sizeof(server_address))) < 0) {
+ TEMP_FAILURE_RETRY(close(fd));
fprintf(stderr, "Error Bind: %s\n", strerror(errno));
return -1;
}
- if (listen(fd, backlog) != 0) {
+ if (TEMP_FAILURE_RETRY(listen(fd, backlog)) != 0) {
fprintf(stderr, "Error Listen: %s\n", strerror(errno));
return -1;
}
@@ -144,7 +150,7 @@ intptr_t ServerSocket::Accept(intptr_t fd) {
intptr_t socket;
struct sockaddr clientaddr;
socklen_t addrlen = sizeof(clientaddr);
- socket = accept(fd, &clientaddr, &addrlen);
+ socket = TEMP_FAILURE_RETRY(accept(fd, &clientaddr, &addrlen));
if (socket < 0) {
fprintf(stderr, "Error Accept: %s\n", strerror(errno));
} else {
« no previous file with comments | « runtime/bin/socket_linux.cc ('k') | runtime/platform/globals.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698