OLD | NEW |
1 // Copyright (c) 2012, 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 import "dart:collection" show HashMap; | 5 import "dart:collection" show HashMap; |
6 import "dart:_internal"; | 6 import "dart:_internal"; |
7 | 7 |
8 patch class ReceivePort { | 8 @patch class ReceivePort { |
9 /* patch */ factory ReceivePort() = _ReceivePortImpl; | 9 /* @patch */ factory ReceivePort() = _ReceivePortImpl; |
10 | 10 |
11 /* patch */ factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) = | 11 /* @patch */ factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) = |
12 _ReceivePortImpl.fromRawReceivePort; | 12 _ReceivePortImpl.fromRawReceivePort; |
13 } | 13 } |
14 | 14 |
15 patch class Capability { | 15 @patch class Capability { |
16 /* patch */ factory Capability() = _CapabilityImpl; | 16 /* @patch */ factory Capability() = _CapabilityImpl; |
17 } | 17 } |
18 | 18 |
19 class _CapabilityImpl implements Capability { | 19 class _CapabilityImpl implements Capability { |
20 factory _CapabilityImpl() native "CapabilityImpl_factory"; | 20 factory _CapabilityImpl() native "CapabilityImpl_factory"; |
21 | 21 |
22 bool operator==(var other) { | 22 bool operator==(var other) { |
23 return (other is _CapabilityImpl) && _equals(other); | 23 return (other is _CapabilityImpl) && _equals(other); |
24 } | 24 } |
25 | 25 |
26 int get hashCode { | 26 int get hashCode { |
27 return _get_hashcode(); | 27 return _get_hashcode(); |
28 } | 28 } |
29 | 29 |
30 _equals(other) native "CapabilityImpl_equals"; | 30 _equals(other) native "CapabilityImpl_equals"; |
31 _get_hashcode() native "CapabilityImpl_get_hashcode"; | 31 _get_hashcode() native "CapabilityImpl_get_hashcode"; |
32 } | 32 } |
33 | 33 |
34 patch class RawReceivePort { | 34 @patch class RawReceivePort { |
35 /** | 35 /** |
36 * Opens a long-lived port for receiving messages. | 36 * Opens a long-lived port for receiving messages. |
37 * | 37 * |
38 * A [RawReceivePort] is low level and does not work with [Zone]s. It | 38 * A [RawReceivePort] is low level and does not work with [Zone]s. It |
39 * can not be paused. The data-handler must be set before the first | 39 * can not be paused. The data-handler must be set before the first |
40 * event is received. | 40 * event is received. |
41 */ | 41 */ |
42 /* patch */ factory RawReceivePort([void handler(event)]) { | 42 /* @patch */ factory RawReceivePort([void handler(event)]) { |
43 _RawReceivePortImpl result = new _RawReceivePortImpl(); | 43 _RawReceivePortImpl result = new _RawReceivePortImpl(); |
44 result.handler = handler; | 44 result.handler = handler; |
45 return result; | 45 return result; |
46 } | 46 } |
47 } | 47 } |
48 | 48 |
49 class _ReceivePortImpl extends Stream implements ReceivePort { | 49 class _ReceivePortImpl extends Stream implements ReceivePort { |
50 _ReceivePortImpl() : this.fromRawReceivePort(new RawReceivePort()); | 50 _ReceivePortImpl() : this.fromRawReceivePort(new RawReceivePort()); |
51 | 51 |
52 _ReceivePortImpl.fromRawReceivePort(this._rawPort) { | 52 _ReceivePortImpl.fromRawReceivePort(this._rawPort) { |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 entryPoint(); | 261 entryPoint(); |
262 } | 262 } |
263 } else { | 263 } else { |
264 entryPoint(message); | 264 entryPoint(message); |
265 } | 265 } |
266 }; | 266 }; |
267 // Make sure the message handler is triggered. | 267 // Make sure the message handler is triggered. |
268 port.sendPort.send(null); | 268 port.sendPort.send(null); |
269 } | 269 } |
270 | 270 |
271 patch class Isolate { | 271 @patch class Isolate { |
272 static final _currentIsolate = _getCurrentIsolate(); | 272 static final _currentIsolate = _getCurrentIsolate(); |
273 static final _rootUri = _getCurrentRootUri(); | 273 static final _rootUri = _getCurrentRootUri(); |
274 | 274 |
275 /* patch */ static Isolate get current => _currentIsolate; | 275 /* @patch */ static Isolate get current => _currentIsolate; |
276 | 276 |
277 /* patch */ static Future<Uri> get packageRoot { | 277 /* @patch */ static Future<Uri> get packageRoot { |
278 var hook = VMLibraryHooks.packageRootUriFuture; | 278 var hook = VMLibraryHooks.packageRootUriFuture; |
279 if (hook == null) { | 279 if (hook == null) { |
280 throw new UnsupportedError("Isolate.packageRoot"); | 280 throw new UnsupportedError("Isolate.packageRoot"); |
281 } | 281 } |
282 return hook(); | 282 return hook(); |
283 } | 283 } |
284 | 284 |
285 /* patch */ static Future<Uri> get packageConfig { | 285 /* @patch */ static Future<Uri> get packageConfig { |
286 var hook = VMLibraryHooks.packageConfigUriFuture; | 286 var hook = VMLibraryHooks.packageConfigUriFuture; |
287 if (hook == null) { | 287 if (hook == null) { |
288 throw new UnsupportedError("Isolate.packageConfig"); | 288 throw new UnsupportedError("Isolate.packageConfig"); |
289 } | 289 } |
290 return hook(); | 290 return hook(); |
291 } | 291 } |
292 | 292 |
293 /* patch */ static Future<Uri> resolvePackageUri(Uri packageUri) { | 293 /* @patch */ static Future<Uri> resolvePackageUri(Uri packageUri) { |
294 var hook = VMLibraryHooks.resolvePackageUriFuture; | 294 var hook = VMLibraryHooks.resolvePackageUriFuture; |
295 if (hook == null) { | 295 if (hook == null) { |
296 throw new UnsupportedError("Isolate.resolvePackageUri"); | 296 throw new UnsupportedError("Isolate.resolvePackageUri"); |
297 } | 297 } |
298 return hook(packageUri); | 298 return hook(packageUri); |
299 } | 299 } |
300 | 300 |
301 static bool _packageSupported() => | 301 static bool _packageSupported() => |
302 (VMLibraryHooks.packageRootUriFuture != null) && | 302 (VMLibraryHooks.packageRootUriFuture != null) && |
303 (VMLibraryHooks.packageConfigUriFuture != null) && | 303 (VMLibraryHooks.packageConfigUriFuture != null) && |
304 (VMLibraryHooks.resolvePackageUriFuture != null); | 304 (VMLibraryHooks.resolvePackageUriFuture != null); |
305 | 305 |
306 /* patch */ static Future<Isolate> spawn( | 306 /* @patch */ static Future<Isolate> spawn( |
307 void entryPoint(message), var message, | 307 void entryPoint(message), var message, |
308 {bool paused: false, bool errorsAreFatal, | 308 {bool paused: false, bool errorsAreFatal, |
309 SendPort onExit, SendPort onError}) async { | 309 SendPort onExit, SendPort onError}) async { |
310 // `paused` isn't handled yet. | 310 // `paused` isn't handled yet. |
311 RawReceivePort readyPort; | 311 RawReceivePort readyPort; |
312 try { | 312 try { |
313 // The VM will invoke [_startIsolate] with entryPoint as argument. | 313 // The VM will invoke [_startIsolate] with entryPoint as argument. |
314 readyPort = new RawReceivePort(); | 314 readyPort = new RawReceivePort(); |
315 | 315 |
316 // We do not inherit the package root or package config settings | 316 // We do not inherit the package root or package config settings |
(...skipping 16 matching lines...) Expand all Loading... |
333 packageRoot, packageConfig); | 333 packageRoot, packageConfig); |
334 return await _spawnCommon(readyPort); | 334 return await _spawnCommon(readyPort); |
335 } catch (e, st) { | 335 } catch (e, st) { |
336 if (readyPort != null) { | 336 if (readyPort != null) { |
337 readyPort.close(); | 337 readyPort.close(); |
338 } | 338 } |
339 return await new Future<Isolate>.error(e, st); | 339 return await new Future<Isolate>.error(e, st); |
340 } | 340 } |
341 } | 341 } |
342 | 342 |
343 /* patch */ static Future<Isolate> spawnUri( | 343 /* @patch */ static Future<Isolate> spawnUri( |
344 Uri uri, List<String> args, var message, | 344 Uri uri, List<String> args, var message, |
345 {bool paused: false, | 345 {bool paused: false, |
346 SendPort onExit, | 346 SendPort onExit, |
347 SendPort onError, | 347 SendPort onError, |
348 bool errorsAreFatal, | 348 bool errorsAreFatal, |
349 bool checked, | 349 bool checked, |
350 Map<String, String> environment, | 350 Map<String, String> environment, |
351 Uri packageRoot, | 351 Uri packageRoot, |
352 Uri packageConfig, | 352 Uri packageConfig, |
353 bool automaticPackageResolution: false}) async { | 353 bool automaticPackageResolution: false}) async { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 static void _spawnUri(SendPort readyPort, String uri, | 471 static void _spawnUri(SendPort readyPort, String uri, |
472 List<String> args, var message, | 472 List<String> args, var message, |
473 bool paused, SendPort onExit, SendPort onError, | 473 bool paused, SendPort onExit, SendPort onError, |
474 bool errorsAreFatal, bool checked, | 474 bool errorsAreFatal, bool checked, |
475 List environment, | 475 List environment, |
476 String packageRoot, String packageConfig) | 476 String packageRoot, String packageConfig) |
477 native "Isolate_spawnUri"; | 477 native "Isolate_spawnUri"; |
478 | 478 |
479 static void _sendOOB(port, msg) native "Isolate_sendOOB"; | 479 static void _sendOOB(port, msg) native "Isolate_sendOOB"; |
480 | 480 |
481 /* patch */ void _pause(Capability resumeCapability) { | 481 /* @patch */ void _pause(Capability resumeCapability) { |
482 var msg = new List(4) | 482 var msg = new List(4) |
483 ..[0] = 0 // Make room for OOB message type. | 483 ..[0] = 0 // Make room for OOB message type. |
484 ..[1] = _PAUSE | 484 ..[1] = _PAUSE |
485 ..[2] = pauseCapability | 485 ..[2] = pauseCapability |
486 ..[3] = resumeCapability; | 486 ..[3] = resumeCapability; |
487 _sendOOB(controlPort, msg); | 487 _sendOOB(controlPort, msg); |
488 } | 488 } |
489 | 489 |
490 /* patch */ void resume(Capability resumeCapability) { | 490 /* @patch */ void resume(Capability resumeCapability) { |
491 var msg = new List(4) | 491 var msg = new List(4) |
492 ..[0] = 0 // Make room for OOB message type. | 492 ..[0] = 0 // Make room for OOB message type. |
493 ..[1] = _RESUME | 493 ..[1] = _RESUME |
494 ..[2] = pauseCapability | 494 ..[2] = pauseCapability |
495 ..[3] = resumeCapability; | 495 ..[3] = resumeCapability; |
496 _sendOOB(controlPort, msg); | 496 _sendOOB(controlPort, msg); |
497 } | 497 } |
498 | 498 |
499 /* patch */ void addOnExitListener(SendPort responsePort, | 499 /* @patch */ void addOnExitListener(SendPort responsePort, |
500 {Object response}) { | 500 {Object response}) { |
501 var msg = new List(4) | 501 var msg = new List(4) |
502 ..[0] = 0 // Make room for OOB message type. | 502 ..[0] = 0 // Make room for OOB message type. |
503 ..[1] = _ADD_EXIT | 503 ..[1] = _ADD_EXIT |
504 ..[2] = responsePort | 504 ..[2] = responsePort |
505 ..[3] = response; | 505 ..[3] = response; |
506 _sendOOB(controlPort, msg); | 506 _sendOOB(controlPort, msg); |
507 } | 507 } |
508 | 508 |
509 /* patch */ void removeOnExitListener(SendPort responsePort) { | 509 /* @patch */ void removeOnExitListener(SendPort responsePort) { |
510 var msg = new List(3) | 510 var msg = new List(3) |
511 ..[0] = 0 // Make room for OOB message type. | 511 ..[0] = 0 // Make room for OOB message type. |
512 ..[1] = _DEL_EXIT | 512 ..[1] = _DEL_EXIT |
513 ..[2] = responsePort; | 513 ..[2] = responsePort; |
514 _sendOOB(controlPort, msg); | 514 _sendOOB(controlPort, msg); |
515 } | 515 } |
516 | 516 |
517 /* patch */ void setErrorsFatal(bool errorsAreFatal) { | 517 /* @patch */ void setErrorsFatal(bool errorsAreFatal) { |
518 var msg = new List(4) | 518 var msg = new List(4) |
519 ..[0] = 0 // Make room for OOB message type. | 519 ..[0] = 0 // Make room for OOB message type. |
520 ..[1] = _ERROR_FATAL | 520 ..[1] = _ERROR_FATAL |
521 ..[2] = terminateCapability | 521 ..[2] = terminateCapability |
522 ..[3] = errorsAreFatal; | 522 ..[3] = errorsAreFatal; |
523 _sendOOB(controlPort, msg); | 523 _sendOOB(controlPort, msg); |
524 } | 524 } |
525 | 525 |
526 /* patch */ void kill({int priority: BEFORE_NEXT_EVENT}) { | 526 /* @patch */ void kill({int priority: BEFORE_NEXT_EVENT}) { |
527 var msg = new List(4) | 527 var msg = new List(4) |
528 ..[0] = 0 // Make room for OOB message type. | 528 ..[0] = 0 // Make room for OOB message type. |
529 ..[1] = _KILL | 529 ..[1] = _KILL |
530 ..[2] = terminateCapability | 530 ..[2] = terminateCapability |
531 ..[3] = priority; | 531 ..[3] = priority; |
532 _sendOOB(controlPort, msg); | 532 _sendOOB(controlPort, msg); |
533 } | 533 } |
534 | 534 |
535 /* patch */ void ping(SendPort responsePort, {Object response, | 535 /* @patch */ void ping(SendPort responsePort, {Object response, |
536 int priority: IMMEDIATE}) { | 536 int priority: IMMEDIATE}) { |
537 var msg = new List(5) | 537 var msg = new List(5) |
538 ..[0] = 0 // Make room for OOM message type. | 538 ..[0] = 0 // Make room for OOM message type. |
539 ..[1] = _PING | 539 ..[1] = _PING |
540 ..[2] = responsePort | 540 ..[2] = responsePort |
541 ..[3] = priority | 541 ..[3] = priority |
542 ..[4] = response; | 542 ..[4] = response; |
543 _sendOOB(controlPort, msg); | 543 _sendOOB(controlPort, msg); |
544 } | 544 } |
545 | 545 |
546 /* patch */ void addErrorListener(SendPort port) { | 546 /* @patch */ void addErrorListener(SendPort port) { |
547 var msg = new List(3) | 547 var msg = new List(3) |
548 ..[0] = 0 // Make room for OOB message type. | 548 ..[0] = 0 // Make room for OOB message type. |
549 ..[1] = _ADD_ERROR | 549 ..[1] = _ADD_ERROR |
550 ..[2] = port; | 550 ..[2] = port; |
551 _sendOOB(controlPort, msg); | 551 _sendOOB(controlPort, msg); |
552 } | 552 } |
553 | 553 |
554 /* patch */ void removeErrorListener(SendPort port) { | 554 /* @patch */ void removeErrorListener(SendPort port) { |
555 var msg = new List(3) | 555 var msg = new List(3) |
556 ..[0] = 0 // Make room for OOB message type. | 556 ..[0] = 0 // Make room for OOB message type. |
557 ..[1] = _DEL_ERROR | 557 ..[1] = _DEL_ERROR |
558 ..[2] = port; | 558 ..[2] = port; |
559 _sendOOB(controlPort, msg); | 559 _sendOOB(controlPort, msg); |
560 } | 560 } |
561 | 561 |
562 static Isolate _getCurrentIsolate() { | 562 static Isolate _getCurrentIsolate() { |
563 List portAndCapabilities = _getPortAndCapabilitiesOfCurrentIsolate(); | 563 List portAndCapabilities = _getPortAndCapabilitiesOfCurrentIsolate(); |
564 return new Isolate(portAndCapabilities[0], | 564 return new Isolate(portAndCapabilities[0], |
565 pauseCapability: portAndCapabilities[1], | 565 pauseCapability: portAndCapabilities[1], |
566 terminateCapability: portAndCapabilities[2]); | 566 terminateCapability: portAndCapabilities[2]); |
567 } | 567 } |
568 | 568 |
569 static List _getPortAndCapabilitiesOfCurrentIsolate() | 569 static List _getPortAndCapabilitiesOfCurrentIsolate() |
570 native "Isolate_getPortAndCapabilitiesOfCurrentIsolate"; | 570 native "Isolate_getPortAndCapabilitiesOfCurrentIsolate"; |
571 | 571 |
572 static Uri _getCurrentRootUri() { | 572 static Uri _getCurrentRootUri() { |
573 try { | 573 try { |
574 return Uri.parse(_getCurrentRootUriStr()); | 574 return Uri.parse(_getCurrentRootUriStr()); |
575 } catch (e, s) { | 575 } catch (e, s) { |
576 return null; | 576 return null; |
577 } | 577 } |
578 } | 578 } |
579 | 579 |
580 static String _getCurrentRootUriStr() | 580 static String _getCurrentRootUriStr() |
581 native "Isolate_getCurrentRootUriStr"; | 581 native "Isolate_getCurrentRootUriStr"; |
582 } | 582 } |
OLD | NEW |