blob: c03318511b738390ac8c31c166aa368d6f5ea03b [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library operation.queue;
import 'dart:collection';
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/operation/operation_analysis.dart';
import 'package:analysis_server/src/operation/operation.dart';
/**
* A queue of operations in an [AnalysisServer].
*/
class ServerOperationQueue {
final List<ServerOperationPriority> _analysisPriorities = [
ServerOperationPriority.ANALYSIS_CONTINUE,
ServerOperationPriority.ANALYSIS];
final AnalysisServer _server;
final List<Queue<ServerOperation>> _queues = <Queue<ServerOperation>>[];
ServerOperationQueue(this._server) {
for (int i = 0; i < ServerOperationPriority.COUNT; i++) {
var queue = new DoubleLinkedQueue<ServerOperation>();
_queues.add(queue);
}
}
/**
* Adds the given operation to this queue. The exact position in the queue
* depends on the priority of the given operation relative to the priorities
* of the other operations in the queue.
*/
void add(ServerOperation operation) {
int queueIndex = operation.priority.ordinal;
Queue<ServerOperation> queue = _queues[queueIndex];
queue.addLast(operation);
}
/**
* Removes all elements in the queue.
*/
void clear() {
for (Queue<ServerOperation> queue in _queues) {
queue.clear();
}
}
/**
* Returns `true` if there are no queued [ServerOperation]s.
*/
bool get isEmpty {
return _queues.every((queue) => queue.isEmpty);
}
/**
* Returns the next operation to perform or `null` if empty.
*/
ServerOperation take() {
// try to find a priority analysis operarion
for (ServerOperationPriority priority in _analysisPriorities) {
Queue<ServerOperation> queue = _queues[priority.ordinal];
for (PerformAnalysisOperation operation in queue) {
if (_server.isPriorityContext(operation.context)) {
queue.remove(operation);
return operation;
}
}
}
// non-priority operations
for (Queue<ServerOperation> queue in _queues) {
if (!queue.isEmpty) {
return queue.removeFirst();
}
}
// empty
return null;
}
}