Chromium Code Reviews| Index: runtime/bin/file.cc |
| diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc |
| index f0205fb8b5275af344212bbdd5feae9787cf7353..aab021bc1f4da2b3da60618049d960b2b69db35a 100644 |
| --- a/runtime/bin/file.cc |
| +++ b/runtime/bin/file.cc |
| @@ -11,6 +11,7 @@ |
| #include "bin/utils.h" |
| #include "include/dart_api.h" |
| +#include "include/dart_native_api.h" |
| namespace dart { |
| namespace bin { |
| @@ -30,14 +31,17 @@ static File* GetFilePointer(Dart_Handle handle) { |
| bool File::ReadFully(void* buffer, int64_t num_bytes) { |
| int64_t remaining = num_bytes; |
| char* current_buffer = reinterpret_cast<char*>(buffer); |
| + Dart_DisableThreadInterrupter(); |
|
siva
2013/12/13 21:29:14
I am wondering if we should have a macro around al
Cutch
2013/12/13 22:40:18
I'm not sure how to build a macro like that in a p
|
| while (remaining > 0) { |
| int bytes_read = Read(current_buffer, remaining); |
| if (bytes_read <= 0) { |
| + Dart_EnableThreadInterrupter(); |
| return false; |
| } |
| remaining -= bytes_read; // Reduce the number of remaining bytes. |
| current_buffer += bytes_read; // Move the buffer forward. |
| } |
| + Dart_EnableThreadInterrupter(); |
| return true; |
| } |
| @@ -45,14 +49,17 @@ bool File::ReadFully(void* buffer, int64_t num_bytes) { |
| bool File::WriteFully(const void* buffer, int64_t num_bytes) { |
| int64_t remaining = num_bytes; |
| const char* current_buffer = reinterpret_cast<const char*>(buffer); |
| + Dart_DisableThreadInterrupter(); |
| while (remaining > 0) { |
| int bytes_read = Write(current_buffer, remaining); |
| if (bytes_read < 0) { |
| + Dart_EnableThreadInterrupter(); |
| return false; |
| } |
| remaining -= bytes_read; // Reduce the number of remaining bytes. |
| current_buffer += bytes_read; // Move the buffer forward. |
| } |
| + Dart_EnableThreadInterrupter(); |
| return true; |
| } |
| @@ -115,7 +122,9 @@ void FUNCTION_NAME(File_ReadByte)(Dart_NativeArguments args) { |
| File* file = GetFilePointer(Dart_GetNativeArgument(args, 0)); |
| ASSERT(file != NULL); |
| uint8_t buffer; |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_read = file->Read(reinterpret_cast<void*>(&buffer), 1); |
| + Dart_EnableThreadInterrupter(); |
| if (bytes_read == 1) { |
| Dart_SetReturnValue(args, Dart_NewInteger(buffer)); |
| } else if (bytes_read == 0) { |
| @@ -134,7 +143,9 @@ void FUNCTION_NAME(File_WriteByte)(Dart_NativeArguments args) { |
| int64_t byte = 0; |
| if (DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 1), &byte)) { |
| uint8_t buffer = static_cast<uint8_t>(byte & 0xff); |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_written = file->Write(reinterpret_cast<void*>(&buffer), 1); |
| + Dart_EnableThreadInterrupter(); |
| if (bytes_written >= 0) { |
| Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); |
| } else { |
| @@ -159,7 +170,9 @@ void FUNCTION_NAME(File_Read)(Dart_NativeArguments args) { |
| if (DartUtils::GetInt64Value(length_object, &length)) { |
| uint8_t* buffer = NULL; |
| Dart_Handle external_array = IOBuffer::Allocate(length, &buffer); |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_read = file->Read(reinterpret_cast<void*>(buffer), length); |
| + Dart_EnableThreadInterrupter(); |
| if (bytes_read < 0) { |
| Dart_Handle err = DartUtils::NewDartOSError(); |
| if (Dart_IsError(err)) Dart_PropagateError(err); |
| @@ -214,7 +227,9 @@ void FUNCTION_NAME(File_ReadInto)(Dart_NativeArguments args) { |
| if (Dart_IsError(result)) Dart_PropagateError(result); |
| ASSERT(end <= array_len); |
| uint8_t* buffer = new uint8_t[length]; |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_read = file->Read(reinterpret_cast<void*>(buffer), length); |
| + Dart_EnableThreadInterrupter(); |
| if (bytes_read >= 0) { |
| result = Dart_ListSetAsBytes(buffer_obj, start, buffer, bytes_read); |
| if (Dart_IsError(result)) { |
| @@ -261,8 +276,9 @@ void FUNCTION_NAME(File_WriteFrom)(Dart_NativeArguments args) { |
| ASSERT(buffer != NULL); |
| // Write the data out into the file. |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_written = file->Write(reinterpret_cast<void*>(buffer), length); |
| - |
| + Dart_EnableThreadInterrupter(); |
| // Release the direct pointer acquired above. |
| result = Dart_TypedDataReleaseData(buffer_obj); |
| if (Dart_IsError(result)) Dart_PropagateError(result); |
| @@ -866,7 +882,9 @@ CObject* File::ReadByteRequest(const CObjectArray& request) { |
| ASSERT(file != NULL); |
| if (!file->IsClosed()) { |
| uint8_t buffer; |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_read = file->Read(reinterpret_cast<void*>(&buffer), 1); |
| + Dart_EnableThreadInterrupter(); |
| if (bytes_read > 0) { |
| return new CObjectIntptr(CObject::NewIntptr(buffer)); |
| } else if (bytes_read == 0) { |
| @@ -891,7 +909,9 @@ CObject* File::WriteByteRequest(const CObjectArray& request) { |
| if (!file->IsClosed()) { |
| int64_t byte = CObjectInt32OrInt64ToInt64(request[1]); |
| uint8_t buffer = static_cast<uint8_t>(byte & 0xff); |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_written = file->Write(reinterpret_cast<void*>(&buffer), 1); |
| + Dart_EnableThreadInterrupter(); |
| if (bytes_written > 0) { |
| return new CObjectInt64(CObject::NewInt64(bytes_written)); |
| } else { |
| @@ -916,7 +936,9 @@ CObject* File::ReadRequest(const CObjectArray& request) { |
| Dart_CObject* io_buffer = CObject::NewIOBuffer(length); |
| ASSERT(io_buffer != NULL); |
| uint8_t* data = io_buffer->value.as_external_typed_data.data; |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_read = file->Read(data, length); |
| + Dart_EnableThreadInterrupter(); |
| if (bytes_read >= 0) { |
| CObjectExternalUint8Array* external_array = |
| new CObjectExternalUint8Array(io_buffer); |
| @@ -948,7 +970,9 @@ CObject* File::ReadIntoRequest(const CObjectArray& request) { |
| Dart_CObject* io_buffer = CObject::NewIOBuffer(length); |
| ASSERT(io_buffer != NULL); |
| uint8_t* data = io_buffer->value.as_external_typed_data.data; |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_read = file->Read(data, length); |
| + Dart_EnableThreadInterrupter(); |
| if (bytes_read >= 0) { |
| CObjectExternalUint8Array* external_array = |
| new CObjectExternalUint8Array(io_buffer); |
| @@ -1028,8 +1052,10 @@ CObject* File::WriteFromRequest(const CObjectArray& request) { |
| } |
| start = 0; |
| } |
| + Dart_DisableThreadInterrupter(); |
| int64_t bytes_written = |
| file->Write(reinterpret_cast<void*>(buffer_start), length); |
| + Dart_EnableThreadInterrupter(); |
| if (!request[1]->IsTypedData()) { |
| delete[] buffer_start; |
| } |