| Index: runtime/bin/fdutils_macos.cc
|
| diff --git a/runtime/bin/fdutils_macos.cc b/runtime/bin/fdutils_macos.cc
|
| index d92b6608c52ce598477d32b36a045fe264214619..4aeccb4b6769292e9220809afab53afeedec4de0 100644
|
| --- a/runtime/bin/fdutils_macos.cc
|
| +++ b/runtime/bin/fdutils_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.
|
|
|
| @@ -12,13 +12,13 @@
|
|
|
| bool FDUtils::SetNonBlocking(intptr_t fd) {
|
| intptr_t status;
|
| - status = fcntl(fd, F_GETFL);
|
| + status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
|
| if (status < 0) {
|
| perror("fcntl F_GETFL failed");
|
| return false;
|
| }
|
| status = (status | O_NONBLOCK);
|
| - if (fcntl(fd, F_SETFL, status) < 0) {
|
| + if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
|
| perror("fcntl F_SETFL failed");
|
| return false;
|
| }
|
| @@ -28,7 +28,7 @@ bool FDUtils::SetNonBlocking(intptr_t fd) {
|
|
|
| bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
|
| intptr_t status;
|
| - status = fcntl(fd, F_GETFL);
|
| + status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
|
| if (status < 0) {
|
| perror("fcntl F_GETFL failed");
|
| return false;
|
| @@ -40,7 +40,7 @@ bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
|
|
|
| intptr_t FDUtils::AvailableBytes(intptr_t fd) {
|
| size_t available;
|
| - int result = ioctl(fd, FIONREAD, &available);
|
| + int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
|
| if (result < 0) {
|
| return result;
|
| }
|
| @@ -57,19 +57,19 @@ ssize_t FDUtils::ReadFromBlocking(int fd, void* buffer, size_t count) {
|
| size_t remaining = count;
|
| char* buffer_pos = reinterpret_cast<char*>(buffer);
|
| while (remaining > 0) {
|
| - ssize_t bytes_read = read(fd, buffer_pos, remaining);
|
| + ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buffer_pos, remaining));
|
| if (bytes_read == 0) {
|
| return count - remaining;
|
| - } else if (bytes_read == -1 && errno != EINTR) {
|
| - // Error codes EAGAIN and EWOULDBLOCK should only happen for non
|
| - // blocking file descriptors.
|
| - ASSERT(errno != EAGAIN && errno != EWOULDBLOCK);
|
| + } else if (bytes_read == -1) {
|
| + ASSERT(EAGAIN == EWOULDBLOCK);
|
| + // Error code EWOULDBLOCK should only happen for non blocking
|
| + // file descriptors.
|
| + ASSERT(errno != EWOULDBLOCK);
|
| return -1;
|
| - } else if (bytes_read > 0) {
|
| + } else {
|
| + ASSERT((bytes_read > 0));
|
| remaining -= bytes_read;
|
| buffer_pos += bytes_read;
|
| - } else {
|
| - ASSERT(errno == EINTR);
|
| }
|
| }
|
| return count;
|
| @@ -85,19 +85,20 @@ ssize_t FDUtils::WriteToBlocking(int fd, const void* buffer, size_t count) {
|
| size_t remaining = count;
|
| char* buffer_pos = const_cast<char*>(reinterpret_cast<const char*>(buffer));
|
| while (remaining > 0) {
|
| - ssize_t bytes_written = write(fd, buffer_pos, remaining);
|
| + ssize_t bytes_written =
|
| + TEMP_FAILURE_RETRY(write(fd, buffer_pos, remaining));
|
| if (bytes_written == 0) {
|
| return count - remaining;
|
| - } else if (bytes_written == -1 && errno != EINTR) {
|
| - // Error codes EAGAIN and EWOULDBLOCK should only happen for non
|
| - // blocking file descriptors.
|
| - ASSERT(errno != EAGAIN && errno != EWOULDBLOCK);
|
| + } else if (bytes_written == -1) {
|
| + ASSERT(EAGAIN == EWOULDBLOCK);
|
| + // Error code EWOULDBLOCK should only happen for non blocking
|
| + // file descriptors.
|
| + ASSERT(errno != EWOULDBLOCK);
|
| return -1;
|
| - } else if (bytes_written > 0) {
|
| + } else {
|
| + ASSERT(bytes_written > 0);
|
| remaining -= bytes_written;
|
| buffer_pos += bytes_written;
|
| - } else {
|
| - ASSERT(errno == EINTR);
|
| }
|
| }
|
| return count;
|
|
|