OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 /// An isolate-compatible object registry and lookup service. | 5 /// An isolate-compatible object registry and lookup service. |
6 library isolate.registry; | 6 library isolate.registry; |
7 | 7 |
8 import 'dart:async' show Future, Completer, TimeoutException; | 8 import 'dart:async' show Future, Completer, TimeoutException; |
9 import 'dart:collection' show HashMap, HashSet; | 9 import 'dart:collection' show HashMap, HashSet; |
10 import 'dart:isolate' show RawReceivePort, SendPort, Capability; | 10 import 'dart:isolate' show RawReceivePort, SendPort, Capability; |
(...skipping 16 matching lines...) Expand all Loading... |
27 /// | 27 /// |
28 /// A `Registry` object caches objects found using the [lookup] | 28 /// A `Registry` object caches objects found using the [lookup] |
29 /// method, or added using [add], and returns the same object every time | 29 /// method, or added using [add], and returns the same object every time |
30 /// they are requested. | 30 /// they are requested. |
31 /// A different `Registry` object that works on the same registry will not | 31 /// A different `Registry` object that works on the same registry will not |
32 /// preserve the identity of elements | 32 /// preserve the identity of elements |
33 /// | 33 /// |
34 /// It is recommended to only have one `Registry` object working on the | 34 /// It is recommended to only have one `Registry` object working on the |
35 /// same registry in each isolate. | 35 /// same registry in each isolate. |
36 /// | 36 /// |
37 /// When the registry is shared accross isolates, both elements and tags must | 37 /// When the registry is shared across isolates, both elements and tags must |
38 /// be sendable between the isolates. | 38 /// be sendable between the isolates. |
39 /// Between isolates spawned using [Isolate.spawn] from the same initial | 39 /// Between isolates spawned using [Isolate.spawn] from the same initial |
40 /// isolate, most objectes can be sent. | 40 /// isolate, most objects can be sent. |
41 /// Only simple objects can be sent between isolates originating from different | 41 /// Only simple objects can be sent between isolates originating from different |
42 /// [Isolate.spawnUri] calls. | 42 /// [Isolate.spawnUri] calls. |
43 class Registry<T> { | 43 class Registry<T> { |
44 // Most operations fail if they haven't received a response for this duration. | 44 // Most operations fail if they haven't received a response for this duration. |
45 final Duration _timeout; | 45 final Duration _timeout; |
46 | 46 |
47 // Each `Registry` object has a cache of objects being controlled by it. | 47 // Each `Registry` object has a cache of objects being controlled by it. |
48 // The cache is stored in an [Expando], not on the object. | 48 // The cache is stored in an [Expando], not on the object. |
49 // This allows sending the `Registry` object through a `SendPort` without | 49 // This allows sending the `Registry` object through a `SendPort` without |
50 // also copying the cache. | 50 // also copying the cache. |
51 static Expando _caches = new Expando(); | 51 static Expando _caches = new Expando(); |
52 | 52 |
53 /// Port for sending command to the central registry mananger. | 53 /// Port for sending command to the central registry manager. |
54 SendPort _commandPort; | 54 SendPort _commandPort; |
55 | 55 |
56 /// Create a registry linked to a [RegistryManager] through [commandPort]. | 56 /// Create a registry linked to a [RegistryManager] through [commandPort]. |
57 /// | 57 /// |
58 /// In most cases, a registry is created by using the | 58 /// In most cases, a registry is created by using the |
59 /// [RegistryManager.registry] getter. | 59 /// [RegistryManager.registry] getter. |
60 /// | 60 /// |
61 /// If a registry is used between isolates created using [Isolate.spawnUri], | 61 /// If a registry is used between isolates created using [Isolate.spawnUri], |
62 /// the `Registry` object can't be sent between the isolates directly. | 62 /// the `Registry` object can't be sent between the isolates directly. |
63 /// Instead the [RegistryManager.commandPort] port can be sent and a | 63 /// Instead the [RegistryManager.commandPort] port can be sent and a |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
455 } | 455 } |
456 | 456 |
457 /// Entry in [RegistryManager]. | 457 /// Entry in [RegistryManager]. |
458 class _RegistryEntry { | 458 class _RegistryEntry { |
459 final int id; | 459 final int id; |
460 final Object element; | 460 final Object element; |
461 final Set tags = new HashSet(); | 461 final Set tags = new HashSet(); |
462 final Capability removeCapability = new Capability(); | 462 final Capability removeCapability = new Capability(); |
463 _RegistryEntry(this.id, this.element); | 463 _RegistryEntry(this.id, this.element); |
464 } | 464 } |
OLD | NEW |