| Index: runtime/bin/file_win.cc
|
| diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
|
| index 7a4b0f033f1975cb2afe798e16f222a6da249f5d..62e7961f84e92a7161ec996e91ad08e34e619867 100644
|
| --- a/runtime/bin/file_win.cc
|
| +++ b/runtime/bin/file_win.cc
|
| @@ -17,6 +17,7 @@
|
| #include "bin/builtin.h"
|
| #include "bin/log.h"
|
| #include "bin/utils.h"
|
| +#include "platform/utils.h"
|
|
|
|
|
| namespace dart {
|
| @@ -105,6 +106,44 @@ bool File::Flush() {
|
| }
|
|
|
|
|
| +bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
|
| + ASSERT(handle_->fd() >= 0);
|
| + ASSERT(end == -1 || end > start);
|
| + HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(handle_->fd()));
|
| + OVERLAPPED overlapped;
|
| + ZeroMemory(&overlapped, sizeof(OVERLAPPED));
|
| +
|
| + overlapped.Offset = Utils::Low32Bits(start);
|
| + overlapped.OffsetHigh = Utils::High32Bits(start);
|
| +
|
| + int64_t length = end == -1 ? 0 : end - start;
|
| + if (length == 0) length = kMaxInt64;
|
| + int32_t length_low = Utils::Low32Bits(length);
|
| + int32_t length_high = Utils::High32Bits(length);
|
| +
|
| +
|
| + BOOL rc;
|
| + switch (lock) {
|
| + case File::kLockUnlock:
|
| + rc = UnlockFileEx(handle, 0, length_low, length_high, &overlapped);
|
| + break;
|
| + case File::kLockShared:
|
| + case File::kLockExclusive: {
|
| + DWORD flags = LOCKFILE_FAIL_IMMEDIATELY;
|
| + if (lock == File::kLockExclusive) {
|
| + flags |= LOCKFILE_EXCLUSIVE_LOCK;
|
| + }
|
| + rc = LockFileEx(handle, flags, 0,
|
| + length_low, length_high, &overlapped);
|
| + break;
|
| + }
|
| + default:
|
| + UNREACHABLE();
|
| + }
|
| + return rc;
|
| +}
|
| +
|
| +
|
| int64_t File::Length() {
|
| ASSERT(handle_->fd() >= 0);
|
| struct __stat64 st;
|
| @@ -437,7 +476,7 @@ char* File::LinkTarget(const char* pathname) {
|
| // Remove "\??\" from beginning of target.
|
| if (target_length > 4 && wcsncmp(L"\\??\\", target, 4) == 0) {
|
| target += 4;
|
| - target_length -=4;
|
| + target_length -= 4;
|
| }
|
| int utf8_length = WideCharToMultiByte(CP_UTF8,
|
| 0,
|
|
|