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

Unified Diff: runtime/bin/directory_posix.cc

Issue 9310082: Run all directory async operations on a separate thread using native ports (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Adderssed review comments from ager@ (and rebased) Created 8 years, 10 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/directory_impl.dart ('k') | runtime/bin/directory_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/directory_posix.cc
diff --git a/runtime/bin/directory_posix.cc b/runtime/bin/directory_posix.cc
index 9cad78824f6228ea1da59b8b4c55e40000db396b..81cfc372760cd20f10c3d7a30f1ded7d8c292982 100644
--- a/runtime/bin/directory_posix.cc
+++ b/runtime/bin/directory_posix.cc
@@ -30,10 +30,7 @@ static void SetOsErrorMessage(char* os_error_message,
// Forward declarations.
static bool ListRecursively(const char* dir_name,
bool recursive,
- Dart_Port dir_port,
- Dart_Port file_port,
- Dart_Port done_port,
- Dart_Port error_port);
+ DirectoryListing* listing);
static bool DeleteRecursively(const char* dir_name);
@@ -64,10 +61,7 @@ static bool HandleDir(char* dir_name,
char* path,
int path_length,
bool recursive,
- Dart_Port dir_port,
- Dart_Port file_port,
- Dart_Port done_port,
- Dart_Port error_port) {
+ DirectoryListing *listing) {
if (strcmp(dir_name, ".") != 0 &&
strcmp(dir_name, "..") != 0) {
size_t written = snprintf(path + path_length,
@@ -77,17 +71,10 @@ static bool HandleDir(char* dir_name,
if (written != strlen(dir_name)) {
return false;
}
- if (dir_port != 0) {
- Dart_Handle name = Dart_NewString(path);
- Dart_Post(dir_port, name);
- }
+ bool ok = listing->HandleDirectory(dir_name);
+ if (!ok) return ok;
if (recursive) {
- return ListRecursively(path,
- recursive,
- dir_port,
- file_port,
- done_port,
- error_port);
+ return ListRecursively(path, recursive, listing);
}
}
return true;
@@ -97,57 +84,52 @@ static bool HandleDir(char* dir_name,
static bool HandleFile(char* file_name,
char* path,
int path_length,
- Dart_Port file_port) {
- if (file_port != 0) {
- size_t written = snprintf(path + path_length,
- PATH_MAX - path_length,
- "%s",
- file_name);
- if (written != strlen(file_name)) {
- return false;
- }
- Dart_Handle name = Dart_NewString(path);
- Dart_Post(file_port, name);
+ DirectoryListing *listing) {
+ // TODO(sgjesse): Pass flags to indicate whether file responses are
+ // needed.
+ size_t written = snprintf(path + path_length,
+ PATH_MAX - path_length,
+ "%s",
+ file_name);
+ if (written != strlen(file_name)) {
+ return false;
}
- return true;
+ return listing->HandleFile(path);
}
-static void PostError(Dart_Port error_port,
+static void PostError(DirectoryListing *listing,
const char* prefix,
const char* suffix,
int error_code) {
- if (error_port != 0) {
- char* error_str = Platform::StrError(error_code);
- int error_message_size =
- strlen(prefix) + strlen(suffix) + strlen(error_str) + 3;
- char* message = static_cast<char*>(malloc(error_message_size + 1));
- int written = snprintf(message,
- error_message_size + 1,
- "%s%s (%s)",
- prefix,
- suffix,
- error_str);
- ASSERT(written == error_message_size);
- free(error_str);
- Dart_Post(error_port, Dart_NewString(message));
- free(message);
- }
+ // TODO(sgjesse): Pass flags to indicate whether error response is
+ // needed.
+ char* error_str = Platform::StrError(error_code);
+ int error_message_size =
+ strlen(prefix) + strlen(suffix) + strlen(error_str) + 3;
+ char* message = static_cast<char*>(malloc(error_message_size + 1));
+ int written = snprintf(message,
+ error_message_size + 1,
+ "%s%s (%s)",
+ prefix,
+ suffix,
+ error_str);
+ ASSERT(written == error_message_size);
+ free(error_str);
+ listing->HandleError(message);
+ free(message);
}
static bool ListRecursively(const char* dir_name,
bool recursive,
- Dart_Port dir_port,
- Dart_Port file_port,
- Dart_Port done_port,
- Dart_Port error_port) {
+ DirectoryListing *listing) {
DIR* dir_pointer;
do {
dir_pointer = opendir(dir_name);
} while (dir_pointer == NULL && errno == EINTR);
if (dir_pointer == NULL) {
- PostError(error_port, "Directory listing failed for: ", dir_name, errno);
+ PostError(listing, "Directory listing failed for: ", dir_name, errno);
return false;
}
@@ -162,7 +144,7 @@ static bool ListRecursively(const char* dir_name,
bool valid = ComputeFullPath(dir_name, path, &path_length);
if (!valid) {
free(path);
- PostError(error_port, "Directory listing failed for: ", dir_name, errno);
+ PostError(listing, "Directory listing failed for: ", dir_name, errno);
return false;
}
@@ -183,16 +165,13 @@ static bool ListRecursively(const char* dir_name,
path,
path_length,
recursive,
- dir_port,
- file_port,
- done_port,
- error_port);
+ listing);
break;
case DT_REG:
success = success && HandleFile(entry.d_name,
path,
path_length,
- file_port);
+ listing);
break;
case DT_UNKNOWN: {
// On some file systems the entry type is not determined by
@@ -210,7 +189,7 @@ static bool ListRecursively(const char* dir_name,
int lstat_success = TEMP_FAILURE_RETRY(lstat(path, &entry_info));
if (lstat_success == -1) {
success = false;
- PostError(error_port, "Directory listing failed for: ", path, errno);
+ PostError(listing, "Directory listing failed for: ", path, errno);
break;
}
if ((entry_info.st_mode & S_IFMT) == S_IFDIR) {
@@ -218,15 +197,12 @@ static bool ListRecursively(const char* dir_name,
path,
path_length,
recursive,
- dir_port,
- file_port,
- done_port,
- error_port);
+ listing);
} else if ((entry_info.st_mode & S_IFMT) == S_IFREG) {
success = success && HandleFile(entry.d_name,
path,
path_length,
- file_port);
+ listing);
}
break;
}
@@ -237,11 +213,11 @@ static bool ListRecursively(const char* dir_name,
if (read != 0) {
success = false;
- PostError(error_port, "Directory listing failed", "", read);
+ PostError(listing, "Directory listing failed", "", read);
}
if (closedir(dir_pointer) == -1) {
- PostError(error_port, "Failed to close directory", "", errno);
+ PostError(listing, "Failed to close directory", "", errno);
}
free(path);
@@ -364,22 +340,11 @@ static bool DeleteRecursively(const char* dir_name) {
}
-void Directory::List(const char* dir_name,
+bool Directory::List(const char* dir_name,
bool recursive,
- Dart_Port dir_port,
- Dart_Port file_port,
- Dart_Port done_port,
- Dart_Port error_port) {
- bool completed = ListRecursively(dir_name,
- recursive,
- dir_port,
- file_port,
- done_port,
- error_port);
- if (done_port != 0) {
- Dart_Handle value = Dart_NewBoolean(completed);
- Dart_Post(done_port, value);
- }
+ DirectoryListing *listing) {
+ bool completed = ListRecursively(dir_name, recursive, listing);
+ return completed;
}
« no previous file with comments | « runtime/bin/directory_impl.dart ('k') | runtime/bin/directory_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698