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

Side by Side Diff: runtime/bin/directory_impl.dart

Issue 9310082: Run all directory async operations on a separate thread using native ports (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 10 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 unified diff | Download patch | Annotate | Revision Log
« runtime/bin/directory.cc ('K') | « runtime/bin/directory.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 5
6 // Used for holding error code and error message for failed OS system calls. 6 // Used for holding error code and error message for failed OS system calls.
7 class _OSStatus { 7 class _OSStatus {
8 int _errorCode; 8 int _errorCode;
9 String _errorMessage; 9 String _errorMessage;
10 } 10 }
11 11
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 }); 150 });
151 } 151 }
152 } 152 }
153 153
154 Queue<_DirectoryOperation> _queue; 154 Queue<_DirectoryOperation> _queue;
155 _DirectoryOperationIsolate _isolate; 155 _DirectoryOperationIsolate _isolate;
156 } 156 }
157 157
158 158
159 class _Directory implements Directory { 159 class _Directory implements Directory {
160 static final int kCreateService = 0;
161 static final int kDeleteService = 1;
160 162
161 _Directory(String this._path) 163 _Directory(String this._path)
162 : _scheduler = new _DirectoryOperationScheduler(); 164 : _scheduler = new _DirectoryOperationScheduler();
163 165
164 static String _createTemp(String template, 166 static String _createTemp(String template,
165 _OSStatus status) native "Directory_CreateTemp"; 167 _OSStatus status) native "Directory_CreateTemp";
166 static int _exists(String path) native "Directory_Exists"; 168 static int _exists(String path) native "Directory_Exists";
167 static bool _create(String path) native "Directory_Create"; 169 static bool _create(String path) native "Directory_Create";
168 static bool _delete(String path) native "Directory_Delete"; 170 static bool _delete(String path) native "Directory_Delete";
171 static SendPort _newServicePort(int service_id)
172 native "Directory_NewServicePort";
169 173
170 void exists() { 174 void exists() {
171 var handler = (_existsHandler != null) ? _existsHandler : (result) => null; 175 var handler = (_existsHandler != null) ? _existsHandler : (result) => null;
172 var operation = new _DirExistsOperation(_path); 176 var operation = new _DirExistsOperation(_path);
173 _scheduler.enqueue(operation, (result, ignored) { 177 _scheduler.enqueue(operation, (result, ignored) {
174 if (result < 0) { 178 if (result < 0) {
175 if (_errorHandler != null) { 179 if (_errorHandler != null) {
176 _errorHandler("Diretory exists test failed: $_path"); 180 _errorHandler("Diretory exists test failed: $_path");
177 } 181 }
178 } else { 182 } else {
179 handler(result == 1); 183 handler(result == 1);
180 } 184 }
181 }); 185 });
182 } 186 }
183 187
184 bool existsSync() { 188 bool existsSync() {
185 int exists = _exists(_path); 189 int exists = _exists(_path);
186 if (exists < 0) { 190 if (exists < 0) {
187 throw new DirectoryException("Diretory exists test failed: $_path"); 191 throw new DirectoryException("Diretory exists test failed: $_path");
188 } 192 }
189 return (exists == 1); 193 return (exists == 1);
190 } 194 }
191 195
192 void create() { 196 void create() {
193 var handler = (_createHandler != null) ? _createHandler : () => null; 197 if (_directoryCreateService == null) {
194 var operation = new _DirCreateOperation(_path); 198 _directoryCreateService = _newServicePort(kCreateService);
195 _scheduler.enqueue(operation, (result, ignored) { 199 }
196 if (result) { 200 _directoryCreateService.call(_path).receive((result, replyTo) {
197 handler(); 201 if (result) {
198 } else if (_errorHandler != null) { 202 if (_createHandler != null) _createHandler();
199 _errorHandler("Directory creation failed: $_path"); 203 } else if (_errorHandler != null) {
200 } 204 _errorHandler("Directory creation failed: $_path");
201 }); 205 }
206 });
202 } 207 }
203 208
204 void createSync() { 209 void createSync() {
205 if (!_create(_path)) { 210 if (!_create(_path)) {
206 throw new DirectoryException("Directory creation failed: $_path"); 211 throw new DirectoryException("Directory creation failed: $_path");
207 } 212 }
208 } 213 }
209 214
210 void createTemp() { 215 void createTemp() {
211 var handler = 216 var handler =
(...skipping 17 matching lines...) Expand all
229 _path = result; 234 _path = result;
230 } else { 235 } else {
231 throw new DirectoryException( 236 throw new DirectoryException(
232 "Could not create temporary directory [$_path]: " + 237 "Could not create temporary directory [$_path]: " +
233 "${status._errorMessage}", 238 "${status._errorMessage}",
234 status._errorCode); 239 status._errorCode);
235 } 240 }
236 } 241 }
237 242
238 void delete() { 243 void delete() {
239 var handler = (_deleteHandler != null) ? _deleteHandler : () => null; 244 if (_directoryDeleteService == null) {
240 var operation = new _DirDeleteOperation(_path); 245 _directoryDeleteService = _newServicePort(kDeleteService);
241 _scheduler.enqueue(operation, (result, ignored) { 246 }
242 if (result) { 247 _directoryDeleteService.call(_path).receive((result, replyTo) {
243 handler(); 248 if (result) {
244 } else if (_errorHandler != null) { 249 if (_deleteHandler != null) _deleteHandler();
245 _errorHandler("Directory deletion failed: $_path"); 250 } else if (_errorHandler != null) {
246 } 251 _errorHandler("Directory deletion failed: $_path");
247 }); 252 }
253 });
248 } 254 }
249 255
250 void deleteSync() { 256 void deleteSync() {
251 if (!_delete(_path)) { 257 if (!_delete(_path)) {
252 throw new DirectoryException("Directory deletion failed: $_path"); 258 throw new DirectoryException("Directory deletion failed: $_path");
253 } 259 }
254 } 260 }
255 261
256 void list([bool recursive = false]) { 262 void list([bool recursive = false]) {
257 new _DirectoryListingIsolate().spawn().then((port) { 263 new _DirectoryListingIsolate().spawn().then((port) {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 var _fileHandler; 367 var _fileHandler;
362 var _doneHandler; 368 var _doneHandler;
363 var _existsHandler; 369 var _existsHandler;
364 var _createHandler; 370 var _createHandler;
365 var _createTempHandler; 371 var _createTempHandler;
366 var _deleteHandler; 372 var _deleteHandler;
367 var _errorHandler; 373 var _errorHandler;
368 374
369 String _path; 375 String _path;
370 _DirectoryOperationScheduler _scheduler; 376 _DirectoryOperationScheduler _scheduler;
377
378 static SendPort _directoryCreateService;
379 static SendPort _directoryDeleteService;
371 } 380 }
OLDNEW
« runtime/bin/directory.cc ('K') | « runtime/bin/directory.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698