Index: runtime/bin/file_macos.cc |
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc |
index 25387bdac03fe94d174c70aa5ac4a68625138547..3187f9040fbe1aae028490499b12ed4f90a26074 100644 |
--- a/runtime/bin/file_macos.cc |
+++ b/runtime/bin/file_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. |
@@ -39,7 +39,7 @@ File::~File() { |
void File::Close() { |
ASSERT(handle_->fd() >= 0); |
- int err = close(handle_->fd()); |
+ int err = TEMP_FAILURE_RETRY(close(handle_->fd())); |
if (err != 0) { |
const int kBufferSize = 1024; |
char error_message[kBufferSize]; |
@@ -57,49 +57,49 @@ bool File::IsClosed() { |
int64_t File::Read(void* buffer, int64_t num_bytes) { |
ASSERT(handle_->fd() >= 0); |
- return read(handle_->fd(), buffer, num_bytes); |
+ return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes)); |
} |
int64_t File::Write(const void* buffer, int64_t num_bytes) { |
ASSERT(handle_->fd() >= 0); |
- return write(handle_->fd(), buffer, num_bytes); |
+ return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes)); |
} |
off_t File::Position() { |
ASSERT(handle_->fd() >= 0); |
- return lseek(handle_->fd(), 0, SEEK_CUR); |
+ return TEMP_FAILURE_RETRY(lseek(handle_->fd(), 0, SEEK_CUR)); |
} |
bool File::SetPosition(int64_t position) { |
ASSERT(handle_->fd() >= 0); |
- return (lseek(handle_->fd(), position, SEEK_SET) != -1); |
+ return TEMP_FAILURE_RETRY(lseek(handle_->fd(), position, SEEK_SET) != -1); |
} |
bool File::Truncate(int64_t length) { |
ASSERT(handle_->fd() >= 0); |
- return (ftruncate(handle_->fd(), length) != -1); |
+ return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length) != -1); |
} |
void File::Flush() { |
ASSERT(handle_->fd() >= 0); |
- fsync(handle_->fd()); |
+ TEMP_FAILURE_RETRY(fsync(handle_->fd())); |
} |
off_t File::Length() { |
ASSERT(handle_->fd() >= 0); |
- off_t position = lseek(handle_->fd(), 0, SEEK_CUR); |
+ off_t position = TEMP_FAILURE_RETRY(lseek(handle_->fd(), 0, SEEK_CUR)); |
if (position < 0) { |
// The file is not capable of seeking. Return an error. |
return -1; |
} |
- off_t result = lseek(handle_->fd(), 0, SEEK_END); |
- lseek(handle_->fd(), position, SEEK_SET); |
+ off_t result = TEMP_FAILURE_RETRY(lseek(handle_->fd(), 0, SEEK_END)); |
+ TEMP_FAILURE_RETRY(lseek(handle_->fd(), position, SEEK_SET)); |
return result; |
} |
@@ -112,7 +112,7 @@ File* File::Open(const char* name, FileOpenMode mode) { |
if ((mode & kTruncate) != 0) { |
flags = flags | O_TRUNC; |
} |
- int fd = open(name, flags, 0666); |
+ int fd = TEMP_FAILURE_RETRY(open(name, flags, 0666)); |
if (fd < 0) { |
return NULL; |
} |
@@ -122,7 +122,7 @@ File* File::Open(const char* name, FileOpenMode mode) { |
bool File::Exists(const char* name) { |
struct stat st; |
- if (stat(name, &st) == 0) { |
+ if (TEMP_FAILURE_RETRY(stat(name, &st)) == 0) { |
return S_ISREG(st.st_mode); // Deal with symlinks? |
} else { |
return false; |
@@ -130,13 +130,8 @@ bool File::Exists(const char* name) { |
} |
-bool File::IsAbsolutePath(const char* pathname) { |
- return (pathname != NULL && pathname[0] == '/'); |
-} |
- |
- |
bool File::Create(const char* name) { |
- int fd = open(name, O_RDONLY | O_CREAT, 0666); |
+ int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CREAT, 0666)); |
if (fd < 0) { |
return false; |
} |
@@ -145,7 +140,7 @@ bool File::Create(const char* name) { |
bool File::Delete(const char* name) { |
- int status = remove(name); |
+ int status = TEMP_FAILURE_RETRY(remove(name)); |
if (status == -1) { |
return false; |
} |
@@ -153,6 +148,11 @@ bool File::Delete(const char* name) { |
} |
+bool File::IsAbsolutePath(const char* pathname) { |
+ return (pathname != NULL && pathname[0] == '/'); |
+} |
+ |
+ |
char* File::GetCanonicalPath(const char* pathname) { |
char* abs_path = NULL; |
if (pathname != NULL) { |
@@ -160,9 +160,11 @@ char* File::GetCanonicalPath(const char* pathname) { |
// space for the resolved_path when a NULL is passed in does not seem to |
// work, so we explicitly allocate space. The caller is responsible for |
// freeing this space as in a regular realpath call. |
- char* resolved_path = reinterpret_cast<char*>(malloc(PATH_MAX+1)); |
+ char* resolved_path = reinterpret_cast<char*>(malloc(PATH_MAX + 1)); |
ASSERT(resolved_path != NULL); |
- abs_path = realpath(pathname, resolved_path); |
+ do { |
+ abs_path = realpath(pathname, NULL); |
+ } while (abs_path == NULL && errno == EINTR); |
assert(abs_path == NULL || IsAbsolutePath(abs_path)); |
} |
return abs_path; |