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

Unified Diff: runtime/bin/file_win.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_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,
« no previous file with comments | « runtime/bin/file_patch.dart ('k') | runtime/bin/io_service.h » ('j') | sdk/lib/io/file.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698