OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of dart.io; | 5 part of dart.io; |
6 | 6 |
7 // Read the file in blocks of size 64k. | 7 // Read the file in blocks of size 64k. |
8 const int _BLOCK_SIZE = 64 * 1024; | 8 const int _BLOCK_SIZE = 64 * 1024; |
9 | 9 |
10 | 10 |
(...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 _checkAvailable(); | 912 _checkAvailable(); |
913 var result = _ops.flush(); | 913 var result = _ops.flush(); |
914 if (result is OSError) { | 914 if (result is OSError) { |
915 throw new FileSystemException("flush failed", path, result); | 915 throw new FileSystemException("flush failed", path, result); |
916 } | 916 } |
917 } | 917 } |
918 | 918 |
919 static final int LOCK_UNLOCK = 0; | 919 static final int LOCK_UNLOCK = 0; |
920 static final int LOCK_SHARED = 1; | 920 static final int LOCK_SHARED = 1; |
921 static final int LOCK_EXCLUSIVE = 2; | 921 static final int LOCK_EXCLUSIVE = 2; |
| 922 static final int LOCK_BLOCKING_SHARED = 3; |
| 923 static final int LOCK_BLOCKING_EXCLUSIVE = 4; |
| 924 |
| 925 int _fileLockValue(FileLock fl) { |
| 926 switch (fl) { |
| 927 case FileLock.SHARED: return LOCK_SHARED; |
| 928 case FileLock.EXCLUSIVE: return LOCK_EXCLUSIVE; |
| 929 case FileLock.BLOCKING_SHARED: return LOCK_BLOCKING_SHARED; |
| 930 case FileLock.BLOCKING_EXCLUSIVE: return LOCK_BLOCKING_EXCLUSIVE; |
| 931 default: return -1; |
| 932 } |
| 933 } |
922 | 934 |
923 Future<RandomAccessFile> lock( | 935 Future<RandomAccessFile> lock( |
924 [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]) { | 936 [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]) { |
925 if ((mode is !FileLock) || (start is !int) || (end is !int)) { | 937 if ((mode is !FileLock) || (start is !int) || (end is !int)) { |
926 throw new ArgumentError(); | 938 throw new ArgumentError(); |
927 } | 939 } |
928 if ((start < 0) || (end < -1) || ((end != -1) && (start >= end))) { | 940 if ((start < 0) || (end < -1) || ((end != -1) && (start >= end))) { |
929 throw new ArgumentError(); | 941 throw new ArgumentError(); |
930 } | 942 } |
931 int lock = (mode == FileLock.EXCLUSIVE) ? LOCK_EXCLUSIVE : LOCK_SHARED; | 943 int lock = _fileLockValue(mode); |
932 return _dispatch(_FILE_LOCK, [null, lock, start, end]) | 944 return _dispatch(_FILE_LOCK, [null, lock, start, end]) |
933 .then((response) { | 945 .then((response) { |
934 if (_isErrorResponse(response)) { | 946 if (_isErrorResponse(response)) { |
935 throw _exceptionFromResponse(response, 'lock failed', path); | 947 throw _exceptionFromResponse(response, 'lock failed', path); |
936 } | 948 } |
937 return this; | 949 return this; |
938 }); | 950 }); |
939 } | 951 } |
940 | 952 |
941 Future<RandomAccessFile> unlock([int start = 0, int end = -1]) { | 953 Future<RandomAccessFile> unlock([int start = 0, int end = -1]) { |
(...skipping 14 matching lines...) Expand all Loading... |
956 | 968 |
957 void lockSync( | 969 void lockSync( |
958 [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]) { | 970 [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]) { |
959 _checkAvailable(); | 971 _checkAvailable(); |
960 if ((mode is !FileLock) || (start is !int) || (end is !int)) { | 972 if ((mode is !FileLock) || (start is !int) || (end is !int)) { |
961 throw new ArgumentError(); | 973 throw new ArgumentError(); |
962 } | 974 } |
963 if ((start < 0) || (end < -1) || ((end != -1) && (start >= end))) { | 975 if ((start < 0) || (end < -1) || ((end != -1) && (start >= end))) { |
964 throw new ArgumentError(); | 976 throw new ArgumentError(); |
965 } | 977 } |
966 int lock = (mode == FileLock.EXCLUSIVE) ? LOCK_EXCLUSIVE : LOCK_SHARED; | 978 int lock = _fileLockValue(mode); |
967 var result = _ops.lock(lock, start, end); | 979 var result = _ops.lock(lock, start, end); |
968 if (result is OSError) { | 980 if (result is OSError) { |
969 throw new FileSystemException('lock failed', path, result); | 981 throw new FileSystemException('lock failed', path, result); |
970 } | 982 } |
971 } | 983 } |
972 | 984 |
973 void unlockSync([int start = 0, int end = -1]) { | 985 void unlockSync([int start = 0, int end = -1]) { |
974 _checkAvailable(); | 986 _checkAvailable(); |
975 if ((start is !int) || (end is !int)) { | 987 if ((start is !int) || (end is !int)) { |
976 throw new ArgumentError(); | 988 throw new ArgumentError(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 void _checkAvailable() { | 1028 void _checkAvailable() { |
1017 if (_asyncDispatched) { | 1029 if (_asyncDispatched) { |
1018 throw new FileSystemException("An async operation is currently pending", | 1030 throw new FileSystemException("An async operation is currently pending", |
1019 path); | 1031 path); |
1020 } | 1032 } |
1021 if (closed) { | 1033 if (closed) { |
1022 throw new FileSystemException("File closed", path); | 1034 throw new FileSystemException("File closed", path); |
1023 } | 1035 } |
1024 } | 1036 } |
1025 } | 1037 } |
OLD | NEW |