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

Side by Side Diff: pkg/analysis_server/lib/src/context_manager.dart

Issue 1447603004: Fix for the watcher leak. (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/analysis_server/test/context_manager_test.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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 context.directory.manager; 5 library context.directory.manager;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:collection'; 8 import 'dart:collection';
9 import 'dart:convert'; 9 import 'dart:convert';
10 import 'dart:core' hide Resource; 10 import 'dart:core' hide Resource;
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 /** 397 /**
398 * Virtual [ContextInfo] which acts as the ancestor of all other 398 * Virtual [ContextInfo] which acts as the ancestor of all other
399 * [ContextInfo]s. 399 * [ContextInfo]s.
400 */ 400 */
401 final ContextInfo _rootInfo = new ContextInfo._root(); 401 final ContextInfo _rootInfo = new ContextInfo._root();
402 402
403 /** 403 /**
404 * Stream subscription we are using to watch each analysis root directory for 404 * Stream subscription we are using to watch each analysis root directory for
405 * changes. 405 * changes.
406 */ 406 */
407 final Map<Folder, StreamSubscription<WatchEvent>> _changeSubscriptions = 407 final Map<Folder, StreamSubscription<WatchEvent>> changeSubscriptions =
408 <Folder, StreamSubscription<WatchEvent>>{}; 408 <Folder, StreamSubscription<WatchEvent>>{};
409 409
410 ContextManagerImpl(this.resourceProvider, this.packageResolverProvider, 410 ContextManagerImpl(this.resourceProvider, this.packageResolverProvider,
411 this._packageMapProvider, this._instrumentationService) { 411 this._packageMapProvider, this._instrumentationService) {
412 pathContext = resourceProvider.pathContext; 412 pathContext = resourceProvider.pathContext;
413 } 413 }
414 414
415 @override 415 @override
416 List<AnalysisContext> contextsInAnalysisRoot(Folder analysisRoot) { 416 List<AnalysisContext> contextsInAnalysisRoot(Folder analysisRoot) {
417 List<AnalysisContext> contexts = <AnalysisContext>[]; 417 List<AnalysisContext> contexts = <AnalysisContext>[];
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 info.packageRoot = newPackageRoot; 594 info.packageRoot = newPackageRoot;
595 _recomputeFolderDisposition(info); 595 _recomputeFolderDisposition(info);
596 } 596 }
597 } 597 }
598 // create new contexts 598 // create new contexts
599 for (Folder includedFolder in includedFolders) { 599 for (Folder includedFolder in includedFolders) {
600 bool wasIncluded = contextInfos.any((info) { 600 bool wasIncluded = contextInfos.any((info) {
601 return info.folder.isOrContains(includedFolder.path); 601 return info.folder.isOrContains(includedFolder.path);
602 }); 602 });
603 if (!wasIncluded) { 603 if (!wasIncluded) {
604 _changeSubscriptions[includedFolder] = 604 changeSubscriptions[includedFolder] =
605 includedFolder.changes.listen(_handleWatchEvent); 605 includedFolder.changes.listen(_handleWatchEvent);
606 _createContexts(_rootInfo, includedFolder, false); 606 _createContexts(_rootInfo, includedFolder, false);
607 } 607 }
608 } 608 }
609 // remove newly excluded sources 609 // remove newly excluded sources
610 for (ContextInfo info in _rootInfo.descendants) { 610 for (ContextInfo info in _rootInfo.descendants) {
611 // prepare excluded sources 611 // prepare excluded sources
612 Map<String, Source> excludedSources = new HashMap<String, Source>(); 612 Map<String, Source> excludedSources = new HashMap<String, Source>();
613 info.sources.forEach((String path, Source source) { 613 info.sources.forEach((String path, Source source) {
614 if (_isExcludedBy(excludedPaths, path) && 614 if (_isExcludedBy(excludedPaths, path) &&
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 ChangeSet changeSet = new ChangeSet(); 928 ChangeSet changeSet = new ChangeSet();
929 _addSourceFiles(changeSet, folder, parent); 929 _addSourceFiles(changeSet, folder, parent);
930 callbacks.applyChangesToContext(folder, changeSet); 930 callbacks.applyChangesToContext(folder, changeSet);
931 } 931 }
932 } 932 }
933 933
934 /** 934 /**
935 * Clean up and destroy the context associated with the given folder. 935 * Clean up and destroy the context associated with the given folder.
936 */ 936 */
937 void _destroyContext(ContextInfo info) { 937 void _destroyContext(ContextInfo info) {
938 if (_changeSubscriptions.containsKey(info.folder)) { 938 changeSubscriptions.remove(info.folder)?.cancel();
939 _changeSubscriptions[info.folder].cancel();
940 }
941 callbacks.removeContext(info.folder, _computeFlushedFiles(info)); 939 callbacks.removeContext(info.folder, _computeFlushedFiles(info));
942 bool wasRemoved = info.parent.children.remove(info); 940 bool wasRemoved = info.parent.children.remove(info);
943 assert(wasRemoved); 941 assert(wasRemoved);
944 } 942 }
945 943
946 /** 944 /**
947 * Extract a new [packagespecFile]-based context from [oldInfo]. 945 * Extract a new [packagespecFile]-based context from [oldInfo].
948 */ 946 */
949 void _extractContext(ContextInfo oldInfo, File packagespecFile) { 947 void _extractContext(ContextInfo oldInfo, File packagespecFile) {
950 Folder newFolder = packagespecFile.parent; 948 Folder newFolder = packagespecFile.parent;
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
1447 var path = resourceProvider.pathContext.fromUri(uri); 1445 var path = resourceProvider.pathContext.fromUri(uri);
1448 packageMap[name] = <Folder>[resourceProvider.getFolder(path)]; 1446 packageMap[name] = <Folder>[resourceProvider.getFolder(path)];
1449 } 1447 }
1450 }); 1448 });
1451 return <UriResolver>[new SdkExtUriResolver(packageMap)]; 1449 return <UriResolver>[new SdkExtUriResolver(packageMap)];
1452 } else { 1450 } else {
1453 return const <UriResolver>[]; 1451 return const <UriResolver>[];
1454 } 1452 }
1455 } 1453 }
1456 } 1454 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/test/context_manager_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698