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

Unified Diff: runtime/bin/directory.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.h ('k') | runtime/bin/directory_impl.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/directory.cc
diff --git a/runtime/bin/directory.cc b/runtime/bin/directory.cc
index 534fc3c200b612cf4265b536435c8e94c5042102..31bbddbc86a22e5a8acfb26b0f5fe8ab9ce9fe9c 100644
--- a/runtime/bin/directory.cc
+++ b/runtime/bin/directory.cc
@@ -8,38 +8,6 @@
#include "include/dart_api.h"
#include "platform/assert.h"
-static intptr_t GetHandlerPort(Dart_Handle handle) {
- if (Dart_IsNull(handle)) {
- return 0;
- }
- return DartUtils::GetIntegerInstanceField(handle, DartUtils::kIdFieldName);
-}
-
-
-void FUNCTION_NAME(Directory_List)(Dart_NativeArguments args) {
- Dart_EnterScope();
- Dart_Handle path = Dart_GetNativeArgument(args, 1);
- Dart_Handle recursive = Dart_GetNativeArgument(args, 2);
- Dart_Port dir_port = GetHandlerPort(Dart_GetNativeArgument(args, 3));
- Dart_Port file_port = GetHandlerPort(Dart_GetNativeArgument(args, 4));
- Dart_Port done_port = GetHandlerPort(Dart_GetNativeArgument(args, 5));
- Dart_Port error_port =
- GetHandlerPort(Dart_GetNativeArgument(args, 6));
- if (!Dart_IsString(path) || !Dart_IsBoolean(recursive)) {
- Dart_SetReturnValue(args, Dart_NewBoolean(false));
- } else {
- Directory::List(DartUtils::GetStringValue(path),
- DartUtils::GetBooleanValue(recursive),
- dir_port,
- file_port,
- done_port,
- error_port);
- Dart_SetReturnValue(args, Dart_NewBoolean(true));
- }
- Dart_ExitScope();
-}
-
-
void FUNCTION_NAME(Directory_Exists)(Dart_NativeArguments args) {
static const int kError = -1;
static const int kExists = 1;
@@ -131,3 +99,180 @@ void FUNCTION_NAME(Directory_Delete)(Dart_NativeArguments args) {
}
Dart_ExitScope();
}
+
+
+static CObject* DirectoryCreateRequest(const CObjectArray& request) {
+ if (request.Length() == 2 && request[1]->IsString()) {
+ CObjectString path(request[1]);
+ bool created = Directory::Create(path.CString());
+ return CObject::Bool(created);
+ }
+ return CObject::False();
+}
+
+
+static CObject* DirectoryDeleteRequest(const CObjectArray& request) {
+ if (request.Length() == 3 && request[1]->IsString() && request[2]->IsBool()) {
+ CObjectString path(request[1]);
+ CObjectBool recursive(request[2]);
+ bool deleted = Directory::Delete(path.CString(), recursive.Value());
+ return CObject::Bool(deleted);
+ }
+ return CObject::False();
+}
+
+
+static CObject* DirectoryExistsRequest(const CObjectArray& request) {
+ static const int kError = -1;
+ static const int kExists = 1;
+ static const int kDoesNotExist = 0;
+ if (request.Length() == 2 && request[1]->IsString()) {
+ CObjectString path(request[1]);
+ Directory::ExistsResult result = Directory::Exists(path.CString());
+ int return_value = kError;
+ if (result == Directory::EXISTS) {
+ return_value = kExists;
+ }
+ if (result == Directory::DOES_NOT_EXIST) {
+ return_value = kDoesNotExist;
+ }
+ return new CObjectInt32(CObject::NewInt32(return_value));
+ }
+ return new CObjectInt32(CObject::NewInt32(kDoesNotExist));
+}
+
+
+static CObject* DirectoryCreateTempRequest(const CObjectArray& request) {
+ if (request.Length() == 2 && request[1]->IsString()) {
+ CObjectString path(request[1]);
+
+ static const int kMaxChildOsErrorMessageLength = 256;
+ char os_error_message[kMaxChildOsErrorMessageLength];
+ char* result = NULL;
+ int error_code = Directory::CreateTemp(path.CString(),
+ &result,
+ os_error_message,
+ kMaxChildOsErrorMessageLength);
+ if (error_code == 0) {
+ CObject* temp_dir = new CObjectString(CObject::NewString(result));
+ free(result);
+ return temp_dir;
+ } else {
+ ASSERT(result == NULL);
+ CObjectArray* error_response = new CObjectArray(CObject::NewArray(2));
+ if (error_code == -1) {
+ error_response->SetAt(0, new CObjectInt32(CObject::NewInt32(0)));
+ error_response->SetAt(
+ 1, new CObjectString(CObject::NewString("Invalid arguments")));
+ } else {
+ error_response->SetAt(
+ 0, new CObjectInt32(CObject::NewInt32(error_code)));
+ error_response->SetAt(
+ 1, new CObjectString(CObject::NewString(os_error_message)));
+ }
+ return error_response;
+ }
+ }
+ return CObject::False();
+}
+
+
+static CObject* DirectoryListRequest(const CObjectArray& request,
+ Dart_Port response_port) {
+ if (request.Length() == 3 && request[1]->IsString() && request[2]->IsBool()) {
+ DirectoryListing* dir_listing = new DirectoryListing(response_port);
+ CObjectString path(request[1]);
+ CObjectBool recursive(request[2]);
+ bool completed = Directory::List(
+ path.CString(), recursive.Value(), dir_listing);
+ delete dir_listing;
+ CObjectArray* response = new CObjectArray(CObject::NewArray(2));
+ response->SetAt(
+ 0, new CObjectInt32(CObject::NewInt32(DirectoryListing::kListDone)));
+ response->SetAt(1, CObject::Bool(completed));
+ return response;
+ }
+ return CObject::False();
+}
+
+
+void DirectoryService(Dart_Port dest_port_id,
+ Dart_Port reply_port_id,
+ Dart_CObject* message) {
+ CObject* response = CObject::False();
+ CObjectArray request(message);
+ if (message->type == Dart_CObject::kArray) {
+ if (request.Length() > 1 && request[0]->IsInt32()) {
+ CObjectInt32 requestType(request[0]);
+ switch (requestType.Value()) {
+ case Directory::kCreateRequest:
+ response = DirectoryCreateRequest(request);
+ break;
+ case Directory::kDeleteRequest:
+ response = DirectoryDeleteRequest(request);
+ break;
+ case Directory::kExistsRequest:
+ response = DirectoryExistsRequest(request);
+ break;
+ case Directory::kCreateTempRequest:
+ response = DirectoryCreateTempRequest(request);
+ break;
+ case Directory::kListRequest:
+ response = DirectoryListRequest(request, reply_port_id);
+ break;
+ default:
+ UNREACHABLE();
+ }
+ }
+ }
+
+ Dart_PostCObject(reply_port_id, response->AsApiCObject());
+}
+
+
+void FUNCTION_NAME(Directory_NewServicePort)(Dart_NativeArguments args) {
+ Dart_EnterScope();
+ Dart_SetReturnValue(args, Dart_Null());
+ Dart_Port service_port = kIllegalPort;
+ service_port = Dart_NewNativePort("DirectoryService",
+ DirectoryService,
+ true);
+ if (service_port != kIllegalPort) {
+ // Return a send port for the service port.
+ Dart_Handle send_port = Dart_NewSendPort(service_port);
+ Dart_SetReturnValue(args, send_port);
+ }
+ Dart_ExitScope();
+}
+
+
+CObjectArray* DirectoryListing::NewResponse(Response type, char* arg) {
+ CObjectArray* response = new CObjectArray(CObject::NewArray(2));
+ response->SetAt(0, new CObjectInt32(CObject::NewInt32(type)));
+ response->SetAt(1, new CObjectString(CObject::NewString(arg)));
+ return response;
+}
+
+
+bool DirectoryListing::HandleDirectory(char* dir_name) {
+ // TODO(sgjesse): Pass flags to indicate whether directory
+ // responses are needed.
+ CObjectArray* response = NewResponse(kListDirectory, dir_name);
+ return Dart_PostCObject(response_port_, response->AsApiCObject());
+}
+
+
+bool DirectoryListing::HandleFile(char* file_name) {
+ // TODO(sgjesse): Pass flags to indicate whether file
+ // responses are needed.
+ CObjectArray* response = NewResponse(kListFile, file_name);
+ return Dart_PostCObject(response_port_, response->AsApiCObject());
+}
+
+
+bool DirectoryListing::HandleError(char* message) {
+ // TODO(sgjesse): Pass flags to indicate whether error
+ // responses are needed.
+ CObjectArray* response = NewResponse(kListError, message);
+ return Dart_PostCObject(response_port_, response->AsApiCObject());
+}
« no previous file with comments | « runtime/bin/directory.h ('k') | runtime/bin/directory_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698