| Index: pkg/analysis_server/lib/src/domain_diagnostic.dart
|
| diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
|
| index 0acddff69ec87c3f39c31554481855b95695f97e..e9bd0c3b1af263f461cc82dfe2ceba17704384ce 100644
|
| --- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
|
| +++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
|
| @@ -4,13 +4,11 @@
|
|
|
| library analysis_server.src.domain_diagnostic;
|
|
|
| -import 'dart:async';
|
| import 'dart:collection';
|
| import 'dart:core' hide Resource;
|
|
|
| import 'package:analysis_server/plugin/protocol/protocol.dart';
|
| import 'package:analysis_server/src/analysis_server.dart';
|
| -import 'package:analysis_server/src/utilities/average.dart';
|
| import 'package:analyzer/file_system/file_system.dart';
|
| import 'package:analyzer/src/context/cache.dart';
|
| import 'package:analyzer/src/context/context.dart';
|
| @@ -35,20 +33,12 @@ class DiagnosticDomainHandler implements RequestHandler {
|
| /// The analysis server that is using this handler to process requests.
|
| final AnalysisServer server;
|
|
|
| - /// The sampler tracking rolling work queue length averages.
|
| - Sampler sampler;
|
| -
|
| /// Initialize a newly created handler to handle requests for the given
|
| /// [server].
|
| DiagnosticDomainHandler(this.server);
|
|
|
| /// Answer the `diagnostic.diagnostics` request.
|
| Response computeDiagnostics(Request request) {
|
| - // Initialize sampler if needed.
|
| - if (sampler == null) {
|
| - sampler = new Sampler(server);
|
| - }
|
| -
|
| List<ContextData> infos = <ContextData>[];
|
| server.folderMap.forEach((Folder folder, AnalysisContext context) {
|
| infos.add(extractData(folder, context));
|
| @@ -62,11 +52,9 @@ class DiagnosticDomainHandler implements RequestHandler {
|
| int explicitFiles = 0;
|
| int implicitFiles = 0;
|
| int workItems = 0;
|
| - String workItemAverage = '-1';
|
| Set<String> exceptions = new HashSet<String>();
|
| if (context is AnalysisContextImpl) {
|
| workItems = _workItemCount(context);
|
| - workItemAverage = sampler.getAverage(folder)?.toString() ?? '-1';
|
| var cache = context.analysisCache;
|
| if (cache is AnalysisCache) {
|
| Set<AnalysisTarget> countedTargets = new HashSet<AnalysisTarget>();
|
| @@ -91,7 +79,7 @@ class DiagnosticDomainHandler implements RequestHandler {
|
| }
|
| }
|
| return new ContextData(context.name, explicitFiles, implicitFiles,
|
| - workItems, workItemAverage, exceptions.toList());
|
| + workItems, exceptions.toList());
|
| }
|
|
|
| @override
|
| @@ -107,83 +95,3 @@ class DiagnosticDomainHandler implements RequestHandler {
|
| return null;
|
| }
|
| }
|
| -
|
| -/// Keeps track of a moving average of work item queue lengths mapped to
|
| -/// contexts.
|
| -///
|
| -/// Sampling terminates after [maxSampleCount], if no one expresses interest
|
| -/// by calling [resetTimerCountdown].
|
| -class Sampler {
|
| - /// Timer interval.
|
| - static const Duration duration = const Duration(seconds: 1);
|
| -
|
| - /// Maximum number of samples taken between calls to [reset].
|
| - static const int maxSampleCount = 30;
|
| -
|
| - /// Current sample count.
|
| - int sampleCount = 0;
|
| -
|
| - /// The shared timer.
|
| - Timer timer;
|
| -
|
| - /// Map of contexts (tracked as folders to avoid leaks) to averages.
|
| - /// TOOD(pq): consider adding GC to remove mappings for deleted folders
|
| - Map<Folder, Average> averages = new HashMap<Folder, Average>();
|
| -
|
| - final AnalysisServer server;
|
| - Sampler(this.server) {
|
| - start();
|
| - _sample();
|
| - }
|
| -
|
| - /// Get the average for the context associated with the given [folder].
|
| - num getAverage(Folder folder) {
|
| - resetTimerCountdown();
|
| - return averages[folder].value;
|
| - }
|
| -
|
| - /// Check if we're currently sampling.
|
| - bool isSampling() => timer?.isActive ?? false;
|
| -
|
| - /// Reset counter.
|
| - void resetTimerCountdown() {
|
| - sampleCount = 0;
|
| - }
|
| -
|
| - /// Start sampling.
|
| - void start() {
|
| - // No need to (re)start if already sampling.
|
| - if (isSampling()) {
|
| - return;
|
| - }
|
| - timer = new Timer.periodic(duration, (Timer timer) {
|
| - _sample();
|
| - if (sampleCount++ >= maxSampleCount) {
|
| - timer.cancel();
|
| - }
|
| - });
|
| - }
|
| -
|
| - /// Stop sampling.
|
| - void stop() {
|
| - timer.cancel();
|
| - }
|
| -
|
| - /// Take a sample.
|
| - void _sample() {
|
| - try {
|
| - server.folderMap.forEach((Folder folder, AnalysisContext context) {
|
| - if (context is AnalysisContextImpl) {
|
| - Average average = averages[folder];
|
| - if (average == null) {
|
| - average = new Average();
|
| - averages[folder] = average;
|
| - }
|
| - average.addSample(_workItemCount(context));
|
| - }
|
| - });
|
| - } on Exception {
|
| - stop();
|
| - }
|
| - }
|
| -}
|
|
|