Chromium Code Reviews| Index: runtime/bin/file_win.cc |
| diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc |
| index 7a4b0f033f1975cb2afe798e16f222a6da249f5d..c1ead3bde145b2896bbc961f130ec192d3e6b0d5 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,43 @@ bool File::Flush() { |
| } |
| +bool File::Lock(File::LockType lock, int64_t start, int64_t end) { |
| + ASSERT(handle_->fd() >= 0); |
| + 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: |
| + rc = LockFileEx(handle, |
| + LOCKFILE_FAIL_IMMEDIATELY, |
| + 0, length_low, length_high, &overlapped); |
| + break; |
| + case File::kLockExclusive: |
| + rc = LockFileEx(handle, |
| + LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, |
| + 0, length_low, length_high, &overlapped); |
| + break; |
| + default: |
|
Lasse Reichstein Nielsen
2015/01/08 11:59:22
Could these two cases be combined - they only diff
Søren Gjesse
2015/01/09 13:06:20
Done.
|
| + return false; |
|
kustermann
2015/01/08 12:54:27
This should be UNREACHABLE()
Søren Gjesse
2015/01/09 13:06:20
Done.
|
| + } |
|
kustermann
2015/01/08 12:54:27
Would it make sense to use GetLastError() if rc ==
Søren Gjesse
2015/01/09 13:06:20
When this results in an OS error in Dart the error
|
| + return rc; |
| +} |
| + |
| + |
| int64_t File::Length() { |
| ASSERT(handle_->fd() >= 0); |
| struct __stat64 st; |
| @@ -437,7 +475,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, |