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

Side by Side Diff: pkg/analyzer/lib/src/context/cache.dart

Issue 1426843002: Fix for leaking AnalysisCache and AnalysisContext instances. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month 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
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/context/context.dart » ('j') | 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) 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 library analyzer.src.context.cache; 5 library analyzer.src.context.cache;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:collection'; 8 import 'dart:collection';
9 9
10 import 'package:analyzer/src/generated/engine.dart' 10 import 'package:analyzer/src/generated/engine.dart'
(...skipping 23 matching lines...) Expand all
34 * An array containing the partitions of which this cache is comprised. 34 * An array containing the partitions of which this cache is comprised.
35 */ 35 */
36 final List<CachePartition> _partitions; 36 final List<CachePartition> _partitions;
37 37
38 /** 38 /**
39 * The [StreamController] reporting [InvalidatedResult]s. 39 * The [StreamController] reporting [InvalidatedResult]s.
40 */ 40 */
41 final ReentrantSynchronousStream<InvalidatedResult> onResultInvalidated = 41 final ReentrantSynchronousStream<InvalidatedResult> onResultInvalidated =
42 new ReentrantSynchronousStream<InvalidatedResult>(); 42 new ReentrantSynchronousStream<InvalidatedResult>();
43 43
44 final List<
45 ReentrantSynchronousStreamSubscription> onResultInvalidatedPartitionSubscr iptions = <
46 ReentrantSynchronousStreamSubscription>[];
47
44 /** 48 /**
45 * Initialize a newly created cache to have the given [partitions]. The 49 * Initialize a newly created cache to have the given [_partitions]. The
46 * partitions will be searched in the order in which they appear in the array, 50 * partitions will be searched in the order in which they appear in the array,
47 * so the most specific partition (usually an [SdkCachePartition]) should be 51 * so the most specific partition (usually an [SdkCachePartition]) should be
48 * first and the most general (usually a [UniversalCachePartition]) last. 52 * first and the most general (usually a [UniversalCachePartition]) last.
49 */ 53 */
50 AnalysisCache(this._partitions) { 54 AnalysisCache(this._partitions) {
51 for (CachePartition partition in _partitions) { 55 for (CachePartition partition in _partitions) {
52 partition.onResultInvalidated.listen((InvalidatedResult event) { 56 ReentrantSynchronousStreamSubscription<InvalidatedResult> subscription =
57 partition.onResultInvalidated.listen((InvalidatedResult event) {
53 onResultInvalidated.add(event); 58 onResultInvalidated.add(event);
54 }); 59 });
60 onResultInvalidatedPartitionSubscriptions.add(subscription);
55 } 61 }
56 } 62 }
57 63
64 /**
65 * Return an iterator returning all of the [Source] targets.
66 */
67 Iterable<Source> get sources {
68 return _partitions
69 .map((CachePartition partition) => partition._sources)
70 .expand((Iterable<Source> sources) => sources);
71 }
72
58 // TODO(brianwilkerson) Implement or delete this. 73 // TODO(brianwilkerson) Implement or delete this.
59 // /** 74 // /**
60 // * Return information about each of the partitions in this cache. 75 // * Return information about each of the partitions in this cache.
61 // */ 76 // */
62 // List<AnalysisContextStatistics_PartitionData> get partitionData { 77 // List<AnalysisContextStatistics_PartitionData> get partitionData {
63 // int count = _partitions.length; 78 // int count = _partitions.length;
64 // List<AnalysisContextStatistics_PartitionData> data = 79 // List<AnalysisContextStatistics_PartitionData> data =
65 // new List<AnalysisContextStatistics_PartitionData>(count); 80 // new List<AnalysisContextStatistics_PartitionData>(count);
66 // for (int i = 0; i < count; i++) { 81 // for (int i = 0; i < count; i++) {
67 // CachePartition partition = _partitions[i]; 82 // CachePartition partition = _partitions[i];
68 // data[i] = new AnalysisContextStatisticsImpl_PartitionDataImpl( 83 // data[i] = new AnalysisContextStatisticsImpl_PartitionDataImpl(
69 // partition.astSize, 84 // partition.astSize,
70 // partition.map.length); 85 // partition.map.length);
71 // } 86 // }
72 // return data; 87 // return data;
73 // } 88 // }
74 89
75 /** 90 /**
76 * Return an iterator returning all of the [Source] targets. 91 * Free any allocated resources and references.
77 */ 92 */
78 Iterable<Source> get sources { 93 void dispose() {
79 return _partitions 94 for (ReentrantSynchronousStreamSubscription subscription
80 .map((CachePartition partition) => partition._sources) 95 in onResultInvalidatedPartitionSubscriptions) {
81 .expand((Iterable<Source> sources) => sources); 96 subscription.cancel();
97 }
82 } 98 }
83 99
84 /** 100 /**
85 * Return the entry associated with the given [target]. 101 * Return the entry associated with the given [target].
86 */ 102 */
87 CacheEntry get(AnalysisTarget target) { 103 CacheEntry get(AnalysisTarget target) {
88 int count = _partitions.length; 104 int count = _partitions.length;
89 for (int i = 0; i < count; i++) { 105 for (int i = 0; i < count; i++) {
90 CachePartition partition = _partitions[i]; 106 CachePartition partition = _partitions[i];
91 if (partition.isResponsibleFor(target)) { 107 if (partition.isResponsibleFor(target)) {
(...skipping 943 matching lines...) Expand 10 before | Expand all | Expand 10 after
1035 * Check whether this delta affects the result described by the given 1051 * Check whether this delta affects the result described by the given
1036 * [descriptor] and [target]. 1052 * [descriptor] and [target].
1037 */ 1053 */
1038 DeltaResult validate(InternalAnalysisContext context, AnalysisTarget target, 1054 DeltaResult validate(InternalAnalysisContext context, AnalysisTarget target,
1039 ResultDescriptor descriptor) { 1055 ResultDescriptor descriptor) {
1040 return DeltaResult.INVALIDATE; 1056 return DeltaResult.INVALIDATE;
1041 } 1057 }
1042 } 1058 }
1043 1059
1044 /** 1060 /**
1045 * The possible results of validating analysis results againt a [Delta]. 1061 * The possible results of validating analysis results against a [Delta].
1046 */ 1062 */
1047 enum DeltaResult { 1063 enum DeltaResult {
1048 /** 1064 /**
1049 * Invalidate this result and continue visiting dependent results 1065 * Invalidate this result and continue visiting dependent results
1050 * with this [Delta]. 1066 * with this [Delta].
1051 */ 1067 */
1052 INVALIDATE, 1068 INVALIDATE,
1053 1069
1054 /** 1070 /**
1055 * Invalidate this result and stop using this [Delta], so unconditionally 1071 * Invalidate this result and stop using this [Delta], so unconditionally
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 for (Function listener in listeners) { 1127 for (Function listener in listeners) {
1112 listener(event); 1128 listener(event);
1113 } 1129 }
1114 } 1130 }
1115 1131
1116 /** 1132 /**
1117 * Listen for the events in this stream. 1133 * Listen for the events in this stream.
1118 * Note that if the [listener] fires a new event, then the [listener] will be 1134 * Note that if the [listener] fires a new event, then the [listener] will be
1119 * invoked again before returning from the [add] invocation. 1135 * invoked again before returning from the [add] invocation.
1120 */ 1136 */
1121 void listen(void listener(T event)) { 1137 ReentrantSynchronousStreamSubscription<T> listen(void listener(T event)) {
1122 listeners.add(listener); 1138 listeners.add(listener);
1139 return new ReentrantSynchronousStreamSubscription<T>(this, listener);
1123 } 1140 }
1124 } 1141 }
1125 1142
1143 /**
1144 * A subscription on events from a [ReentrantSynchronousStream].
1145 */
1146 class ReentrantSynchronousStreamSubscription<T> {
1147 final ReentrantSynchronousStream<T> _stream;
1148 final Function _listener;
1149
1150 ReentrantSynchronousStreamSubscription(this._stream, this._listener);
1151
1152 /**
1153 * Cancels this subscription.
1154 * It will no longer receive events.
1155 */
1156 void cancel() {
1157 _stream.listeners.remove(_listener);
1158 }
1159 }
1160
1126 /** 1161 /**
1127 * The data about a single analysis result that is stored in a [CacheEntry]. 1162 * The data about a single analysis result that is stored in a [CacheEntry].
1128 */ 1163 */
1129 // TODO(brianwilkerson) Consider making this a generic class so that the value 1164 // TODO(brianwilkerson) Consider making this a generic class so that the value
1130 // can be typed. 1165 // can be typed.
1131 class ResultData { 1166 class ResultData {
1132 /** 1167 /**
1133 * The [ResultDescriptor] this result is for. 1168 * The [ResultDescriptor] this result is for.
1134 */ 1169 */
1135 final ResultDescriptor descriptor; 1170 final ResultDescriptor descriptor;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 void resultAccessed(TargetedResult result) {} 1261 void resultAccessed(TargetedResult result) {}
1227 1262
1228 @override 1263 @override
1229 List<TargetedResult> resultStored(TargetedResult newResult, newValue) { 1264 List<TargetedResult> resultStored(TargetedResult newResult, newValue) {
1230 return TargetedResult.EMPTY_LIST; 1265 return TargetedResult.EMPTY_LIST;
1231 } 1266 }
1232 1267
1233 @override 1268 @override
1234 void targetRemoved(AnalysisTarget target) {} 1269 void targetRemoved(AnalysisTarget target) {}
1235 } 1270 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/context/context.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698