Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Leherbauer2008-01-31 11:17:28 +0000
committerAnton Leherbauer2008-01-31 11:17:28 +0000
commit645d096b609ed8f39b01146ee5b31e238c93e7de (patch)
tree31be29bb609ac297c2ee5613d60e4bb2dce2b886 /core/org.eclipse.cdt.core/src
parente88356657e1a097a98e0025186c11c6ef7a46dff (diff)
downloadorg.eclipse.cdt-645d096b609ed8f39b01146ee5b31e238c93e7de.tar.gz
org.eclipse.cdt-645d096b609ed8f39b01146ee5b31e238c93e7de.tar.xz
org.eclipse.cdt-645d096b609ed8f39b01146ee5b31e238c93e7de.zip
Fix for 212998: CModelManager consumes a lot of memory during project refresh
Diffstat (limited to 'core/org.eclipse.cdt.core/src')
-rw-r--r--core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java5
-rw-r--r--core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java33
2 files changed, 24 insertions, 14 deletions
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java
index 2a89a59fc9e..48faad53db1 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -49,7 +49,6 @@ import org.eclipse.cdt.internal.core.cdtvariables.CdtVariableManager;
import org.eclipse.cdt.internal.core.envvar.EnvironmentVariableManager;
import org.eclipse.cdt.internal.core.model.BufferManager;
import org.eclipse.cdt.internal.core.model.CModelManager;
-import org.eclipse.cdt.internal.core.model.DeltaProcessor;
import org.eclipse.cdt.internal.core.model.IBufferFactory;
import org.eclipse.cdt.internal.core.model.Util;
import org.eclipse.cdt.internal.core.pdom.PDOMManager;
@@ -1060,7 +1059,7 @@ public class CCorePlugin extends Plugin {
if(option != null) Util.VERBOSE_MODEL = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
option = Platform.getDebugOption(DELTA);
- if(option != null) DeltaProcessor.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
+ if(option != null) Util.VERBOSE_DELTA= option.equalsIgnoreCase("true") ; //$NON-NLS-1$
}
}
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java
index 16e8f05381a..69b514bd91b 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,14 +7,17 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.core.parser;
import java.io.File;
+import java.util.Collections;
+import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.internal.core.parser.EmptyIterator;
+import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.internal.core.util.ILRUCacheable;
import org.eclipse.cdt.internal.core.util.LRUCache;
import org.eclipse.cdt.internal.core.util.OverflowingLRUCache;
@@ -53,7 +56,7 @@ public class CodeReaderCache implements ICodeReaderCache {
public static final String DEFAULT_CACHE_SIZE_IN_MB_STRING = String.valueOf(DEFAULT_CACHE_SIZE_IN_MB);
private static final int MB_TO_KB_FACTOR = 1024;
private CodeReaderLRUCache cache = null; // the actual cache
- private IResourceChangeListener listener = new UpdateCodeReaderCacheListener(this);
+ private final IResourceChangeListener listener = new UpdateCodeReaderCacheListener(this);
private class UpdateCodeReaderCacheListener implements IResourceChangeListener {
ICodeReaderCache c = null;
@@ -88,7 +91,7 @@ public class CodeReaderCache implements ICodeReaderCache {
if (event.getSource() instanceof IWorkspace && event.getDelta() != null) {
removeKeys(event.getDelta().getAffectedChildren());
}
-
+ event = null;
return Status.OK_STATUS;
}
@@ -127,15 +130,11 @@ public class CodeReaderCache implements ICodeReaderCache {
*/
public CodeReaderCache(int size) {
cache = new CodeReaderLRUCache(size * MB_TO_KB_FACTOR);
- if (ResourcesPlugin.getWorkspace() != null)
- ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);
}
protected void finalize() throws Throwable {
+ flush();
super.finalize();
-
- if (ResourcesPlugin.getWorkspace() != null)
- ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener);
}
/**
@@ -155,7 +154,8 @@ public class CodeReaderCache implements ICodeReaderCache {
if (!(new File(key).exists()))
return null;
- ret = ParserUtil.createReader(key, EmptyIterator.EMPTY_ITERATOR);
+ final List<IWorkingCopy> emptyList= Collections.emptyList();
+ ret = ParserUtil.createReader(key, emptyList.iterator());
if (cache.getSpaceLimit() > 0)
put(ret);
@@ -172,6 +172,10 @@ public class CodeReaderCache implements ICodeReaderCache {
*/
private synchronized CodeReader put(CodeReader value) {
if (value==null) return null;
+ if (cache.isEmpty()) {
+ if (ResourcesPlugin.getWorkspace() != null)
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);
+ }
return cache.put(String.valueOf(value.filename), value);
}
@@ -302,7 +306,12 @@ public class CodeReaderCache implements ICodeReaderCache {
* @param key
*/
public synchronized CodeReader remove(String key) {
- return cache.remove(key);
+ CodeReader removed= cache.remove(key);
+ if (cache.isEmpty()) {
+ if (ResourcesPlugin.getWorkspace() != null)
+ ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener);
+ }
+ return removed;
}
/**
@@ -315,6 +324,8 @@ public class CodeReaderCache implements ICodeReaderCache {
public void flush() {
cache.flush();
+ if (ResourcesPlugin.getWorkspace() != null)
+ ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener);
}
}

Back to the top