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

Unified Diff: sdk/lib/io/file.dart

Issue 833623004: Add support for file locking (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Comment/doc fixes 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: sdk/lib/io/file.dart
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 9565d4dc38b41002877e4cc99cf03f7c7153930a..767308e4288a35446ebb25541b77c57afb8a49f5 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -32,6 +32,18 @@ const WRITE = FileMode.WRITE;
/// end of it. The file is created if it does not already exist.
const APPEND = FileMode.APPEND;
+/// Type of lock when requesting a lock on a file.
+class FileLock {
Lasse Reichstein Nielsen 2015/01/08 11:59:22 Make this an enum.
Søren Gjesse 2015/01/09 13:06:20 Not yet. Enums still not enabled by default in dar
+ final int _lock;
+
+ /// Shared file lock.
+ static const SHARED = const FileLock._internal(0);
+ /// Exclusive file lock.
kustermann 2015/01/08 12:54:27 empty line before '///'.
Søren Gjesse 2015/01/09 13:06:20 Done.
+ static const EXCLUSIVE = const FileLock._internal(1);
+
+ const FileLock._internal(this._lock);
+}
+
/**
* A reference to a file on the file system.
*
@@ -698,6 +710,93 @@ abstract class RandomAccessFile {
void flushSync();
/**
+ * Locks the file or part of the file.
+ *
+ * Locks the byte range from [start] to [end] of the file, with the
+ * byte at position `end` not included. If no arguments are
+ * specified, the full file is locked, If only `start` is specified
+ * the file is locked from byte position `start` to the end of the
+ * file.
+ *
+ * By default an exclusive lock will be obtained, but that can be overridden
+ * by the [mode] argument.
+ *
+ * To obtain an exclusive lock on a file it must be opened for writing.
+ *
+ * *NOTE* file locking does have slight differences in behavior across
+ * platforms:
+ *
+ * On Linux and Mac OS this uses advisory locks, which have the surprising
+ * semantics that all locks associated with a given file are removed when
+ * *any* file descriptor for that file is closed by the process.
Lasse Reichstein Nielsen 2015/01/08 11:59:22 Worth mentioning that advisory locks are not actua
Søren Gjesse 2015/01/09 13:06:20 Done.
+ *
+ * On Windows the regions used for lock and unlock needs to match. If that
+ * is not the case unlocking will result in the OS error "The segment is
+ * already unlocked".
+ */
+ Future<RandomAccessFile> lock(
+ [int start, int end, FileLock mode = FileLock.EXCLUSIVE]);
Lasse Reichstein Nielsen 2015/01/08 11:59:22 As discussed, move mode to first argument. Maybe o
Søren Gjesse 2015/01/09 13:06:20 Done.
+
+ /**
+ * Synchronously locks the file or part of the file.
+ *
+ * Locks the byte range from [start] to [end] of the file ,with the
+ * byte at position `end` not included. If no arguments are
+ * specified, the full file is locked, If only `start` is specified
+ * the file is locked from byte position `start` to the end of the
+ * file.
+ *
+ * By default an exclusive lock will be obtained, but that can be overridden
+ * by the [mode] argument.
+ *
+ * To obtain an exclusive lock on a file it must be opened for writing.
+ *
+ * *NOTE* file locking does have slight differences in behavior across
+ * platforms:
+ *
+ * On Linux and Mac OS this uses advisory locks, which have the surprising
+ * semantics that all locks associated with a given file are removed when
+ * *any* file descriptor for that file is closed by the process.
+ *
+ * On Windows the regions used for lock and unlock needs to match. If that
+ * is not the case unlocking will result in the OS error "The segment is
+ * already unlocked".
+ */
+ void lockSync([int start, int end, FileLock mode = FileLock.EXCLUSIVE]);
+
+ /**
+ * Unlocks the file or part of the file.
+ *
+ * Unlocks the byte range from [start] to [end] of the file, with
+ * the byte at position `end` not included. If no arguments are
+ * specified, the full file is unlocked, If only `start` is
+ * specified the file is unlocked from byte position `start` to the
+ * end of the file.
+ *
+ * *NOTE* file locking does have slight differences in behavior across
+ * platforms:
+ *
+ * See [lock] for more details.
+ */
+ Future<RandomAccessFile> unlock([int start, int end]);
Lasse Reichstein Nielsen 2015/01/08 11:59:22 Maybe default start to 0.
kustermann 2015/01/08 12:54:27 Why is lockSync(), unlockSync() returning void and
Søren Gjesse 2015/01/09 13:06:20 This is the convention for RandomAccessFile. All a
Søren Gjesse 2015/01/09 13:06:20 Done.
+
+ /**
+ * Synchronously unlocks the file or part of the file.
+ *
+ * Unlocks the byte range from [start] to [end] of the file, with
+ * the byte at position `end` not included. If no arguments are
+ * specified, the full file is unlocked, If only `start` is
+ * specified the file is unlocked from byte position `start` to the
+ * end of the file.
+ *
+ * *NOTE* file locking does have slight differences in behavior across
+ * platforms:
+ *
+ * See [lockSync] for more details.
+ */
+ void unlockSync([int start, int end]);
+
+ /**
* Returns a human-readable string for this RandomAccessFile instance.
*/
String toString();

Powered by Google App Engine
This is Rietveld 408576698