Index: dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/index/file/CachingNodeManager.java |
=================================================================== |
--- dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/index/file/CachingNodeManager.java (revision 0) |
+++ dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/index/file/CachingNodeManager.java (revision 0) |
@@ -0,0 +1,116 @@ |
+/* |
+ * Copyright (c) 2014, the Dart project authors. |
+ * |
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except |
+ * in compliance with the License. You may obtain a copy of the License at |
+ * |
+ * http://www.eclipse.org/legal/epl-v10.html |
+ * |
+ * Unless required by applicable law or agreed to in writing, software distributed under the License |
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
+ * or implied. See the License for the specific language governing permissions and limitations under |
+ * the License. |
+ */ |
+ |
+package com.google.dart.engine.internal.index.file; |
+ |
+import com.google.common.cache.Cache; |
+import com.google.common.cache.CacheBuilder; |
+import com.google.common.util.concurrent.Uninterruptibles; |
+import com.google.dart.engine.context.AnalysisContext; |
+ |
+import java.util.concurrent.TimeUnit; |
+ |
+/** |
+ * A {@link NodeManager} that caches {@link IndexNode} accessed from another {@link NodeManager}. |
+ * <p> |
+ * By default up to 64 nodes are cached for 5 seconds. |
+ * |
+ * @coverage dart.engine.index |
+ */ |
+public class CachingNodeManager implements NodeManager { |
+ /** |
+ * A {@link Thread} that performs {@link #cache} clean up. |
+ */ |
+ private class CleanUpThread extends Thread { |
+ public CleanUpThread() { |
+ super("IndexNode cache clean up thread"); |
+ setDaemon(true); |
+ } |
+ |
+ @Override |
+ public void run() { |
+ while (true) { |
+ cache.cleanUp(); |
+ Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); |
+ } |
+ } |
+ } |
+ |
+ private final NodeManager manager; |
+ private final Cache<String, IndexNode> cache; |
+ |
+ public CachingNodeManager(NodeManager manager) { |
+ this.manager = manager; |
+ { |
+ CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder(); |
+ cache = builder.maximumSize(64).expireAfterAccess(5, TimeUnit.SECONDS).build(); |
+ } |
+ new CleanUpThread().start(); |
+ } |
+ |
+ @Override |
+ public void clear() { |
+ manager.clear(); |
+ cache.invalidateAll(); |
+ } |
+ |
+ @Override |
+ public ContextCodec getContextCodec() { |
+ return manager.getContextCodec(); |
+ } |
+ |
+ @Override |
+ public ElementCodec getElementCodec() { |
+ return manager.getElementCodec(); |
+ } |
+ |
+ @Override |
+ public int getLocationCount() { |
+ return manager.getLocationCount(); |
+ } |
+ |
+ @Override |
+ public IndexNode getNode(String name) { |
+ IndexNode node = cache.getIfPresent(name); |
+ if (node == null) { |
+ node = manager.getNode(name); |
+ if (node != null) { |
+ cache.put(name, node); |
+ } |
+ } |
+ return node; |
+ } |
+ |
+ @Override |
+ public StringCodec getStringCodec() { |
+ return manager.getStringCodec(); |
+ } |
+ |
+ @Override |
+ public IndexNode newNode(AnalysisContext context) { |
+ return manager.newNode(context); |
+ } |
+ |
+ @Override |
+ public void putNode(String name, IndexNode node) { |
+ cache.put(name, node); |
+ manager.putNode(name, node); |
+ } |
+ |
+ @Override |
+ public void removeNode(String name) { |
+ cache.invalidate(name); |
+ manager.removeNode(name); |
+ } |
+} |
Property changes on: dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/index/file/CachingNodeManager.java |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |