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

Unified Diff: runtime/bin/file.cc

Issue 833623004: Add support for file locking (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix Windows test Created 5 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
Index: runtime/bin/file.cc
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index a98ff3de909423d1f20b4b52284ecf8e5524c786..c4c417b8603351b6e2526410c3cef8f9d267de06 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -391,6 +391,35 @@ void FUNCTION_NAME(File_Flush)(Dart_NativeArguments args) {
}
+void FUNCTION_NAME(File_Lock)(Dart_NativeArguments args) {
+ File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
+ ASSERT(file != NULL);
+ int64_t lock;
+ int64_t start;
+ int64_t end;
+ if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &lock) &&
+ DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &start) &&
+ DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 3), &end)) {
+ if ((lock >= File::kLockMin) && (lock <= File::kLockMax) &&
+ (start >= 0) && (end == -1 || end > start)) {
+ if (file->Lock(static_cast<File::LockType>(lock), start, end)) {
+ Dart_SetReturnValue(args, Dart_True());
+ } else {
+ Dart_Handle err = DartUtils::NewDartOSError();
+ if (Dart_IsError(err)) Dart_PropagateError(err);
+ Dart_SetReturnValue(args, err);
+ }
+ return;
+ }
+ }
+
+ OSError os_error(-1, "Invalid argument", OSError::kUnknown);
+ Dart_Handle err = DartUtils::NewDartOSError(&os_error);
+ if (Dart_IsError(err)) Dart_PropagateError(err);
+ Dart_SetReturnValue(args, err);
+}
+
+
void FUNCTION_NAME(File_Create)(Dart_NativeArguments args) {
const char* str =
DartUtils::GetStringValue(Dart_GetNativeArgument(args, 0));
@@ -1196,5 +1225,30 @@ CObject* File::StatRequest(const CObjectArray& request) {
return CObject::IllegalArgumentError();
}
+
+CObject* File::LockRequest(const CObjectArray& request) {
+ if (request.Length() == 4 &&
+ request[0]->IsIntptr() &&
+ request[1]->IsInt32OrInt64() &&
+ request[2]->IsInt32OrInt64() &&
+ request[3]->IsInt32OrInt64()) {
+ File* file = CObjectToFilePointer(request[0]);
+ ASSERT(file != NULL);
+ if (!file->IsClosed()) {
+ int64_t lock = CObjectInt32OrInt64ToInt64(request[1]);
+ int64_t start = CObjectInt32OrInt64ToInt64(request[2]);
+ int64_t end = CObjectInt32OrInt64ToInt64(request[3]);
+ if (file->Lock(static_cast<File::LockType>(lock), start, end)) {
+ return CObject::True();
+ } else {
+ return CObject::NewOSError();
+ }
+ } else {
+ return CObject::FileClosedError();
+ }
+ }
+ return CObject::IllegalArgumentError();
+}
+
} // namespace bin
} // namespace dart
« no previous file with comments | « runtime/bin/file.h ('k') | runtime/bin/file_android.cc » ('j') | sdk/lib/io/file.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698