| 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
|
|
|