1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

2004-09-01 Chris Wiebe

avoid unnecessary deltas
	* browser/org/eclipse/cdt/internal/core/browser/cache/TypeCacheManager.java
This commit is contained in:
Chris Wiebe 2004-09-01 22:07:40 +00:00
parent 188ffdc83f
commit acc7f9cd6a
2 changed files with 42 additions and 20 deletions

View file

@ -1,3 +1,8 @@
2004-09-01 Chris Wiebe
avoid unnecessary deltas
* browser/org/eclipse/cdt/internal/core/browser/cache/TypeCacheManager.java
2004-08-31 Chris Wiebe 2004-08-31 Chris Wiebe
Fix for 68883 Fix for 68883

View file

@ -29,6 +29,7 @@ import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.core.internal.runtime.Assert;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.ISafeRunnable;
@ -63,22 +64,36 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
} }
public synchronized void updateProject(IProject project) { public synchronized void updateProject(IProject project) {
// TODO finer-grained flush needed, for now just flush the whole map
fTypeToElementMap.clear();
fElementToTypeMap.clear();
addCacheDelta(project, null); addCacheDelta(project, null);
} }
public synchronized void processElementChanged(ElementChangedEvent event, boolean enableIndexing) {
int deltaCount = processDelta(event.getDelta());
if (deltaCount > 0) {
// TODO finer-grained flush needed, for now just flush the whole map
fTypeToElementMap.clear();
fElementToTypeMap.clear();
reconcile(enableIndexing, Job.BUILD, 0);
}
}
private static final int PATH_ENTRY_FLAGS = ICElementDelta.F_ADDED_PATHENTRY_SOURCE private static final int PATH_ENTRY_FLAGS = ICElementDelta.F_ADDED_PATHENTRY_SOURCE
| ICElementDelta.F_REMOVED_PATHENTRY_SOURCE | ICElementDelta.F_REMOVED_PATHENTRY_SOURCE
| ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE | ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE
| ICElementDelta.F_CHANGED_PATHENTRY_MACRO | ICElementDelta.F_CHANGED_PATHENTRY_MACRO
| ICElementDelta.F_PATHENTRY_REORDER; | ICElementDelta.F_PATHENTRY_REORDER;
public synchronized void processDelta(ICElementDelta delta) { private int processDelta(ICElementDelta delta) {
ICElement elem = delta.getElement(); ICElement elem = delta.getElement();
boolean added = (delta.getKind() == ICElementDelta.ADDED); boolean added = (delta.getKind() == ICElementDelta.ADDED);
boolean removed = (delta.getKind() == ICElementDelta.REMOVED); boolean removed = (delta.getKind() == ICElementDelta.REMOVED);
boolean contentChanged = ((delta.getFlags() & ICElementDelta.F_CONTENT) != 0); boolean contentChanged = ((delta.getFlags() & ICElementDelta.F_CONTENT) != 0);
boolean pathEntryChanged = ((delta.getFlags() & PATH_ENTRY_FLAGS) != 0); boolean pathEntryChanged = ((delta.getFlags() & PATH_ENTRY_FLAGS) != 0);
boolean hasChildren = ((delta.getFlags() & ICElementDelta.F_CHILDREN) != 0); boolean hasChildren = ((delta.getFlags() & ICElementDelta.F_CHILDREN) != 0);
int deltaCount = 0;
switch (elem.getElementType()) { switch (elem.getElementType()) {
case ICElement.C_PROJECT: case ICElement.C_PROJECT:
@ -87,6 +102,7 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
IProject project = cProject.getProject(); IProject project = cProject.getProject();
if (added || removed || pathEntryChanged) { if (added || removed || pathEntryChanged) {
addCacheDelta(project, delta); addCacheDelta(project, delta);
++deltaCount;
} }
} }
break; break;
@ -96,11 +112,12 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
IProject project = cProject.getProject(); IProject project = cProject.getProject();
ITranslationUnit unit = (ITranslationUnit) elem; ITranslationUnit unit = (ITranslationUnit) elem;
if (unit.isWorkingCopy()) { if (unit.isWorkingCopy()) {
processWorkingCopyDelta(delta); deltaCount += processWorkingCopyDelta(delta);
return; return deltaCount;
} else { } else {
if (added || removed || pathEntryChanged || contentChanged) { if (added || removed || pathEntryChanged || contentChanged) {
addCacheDelta(project, delta); addCacheDelta(project, delta);
++deltaCount;
} }
} }
} }
@ -119,6 +136,7 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
IProject project = cProject.getProject(); IProject project = cProject.getProject();
if (added || removed) { if (added || removed) {
addCacheDelta(project, delta); addCacheDelta(project, delta);
++deltaCount;
} }
} }
break; break;
@ -128,10 +146,12 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
ICElementDelta[] children = delta.getAffectedChildren(); ICElementDelta[] children = delta.getAffectedChildren();
if (children != null) { if (children != null) {
for (int i = 0; i < children.length; ++i) { for (int i = 0; i < children.length; ++i) {
processDelta(children[i]); deltaCount += processDelta(children[i]);
} }
} }
} }
return deltaCount;
} }
private void addCacheDelta(IProject project, ICElementDelta delta) { private void addCacheDelta(IProject project, ICElementDelta delta) {
@ -140,14 +160,11 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
} else { } else {
getCache(project).addDelta(new TypeCacheDelta(project, delta)); getCache(project).addDelta(new TypeCacheDelta(project, delta));
} }
// TODO finer-grained flush needed, for now just flush the whole map
fTypeToElementMap.clear();
fElementToTypeMap.clear();
} }
public synchronized void processWorkingCopyDelta(ICElementDelta delta) { private int processWorkingCopyDelta(ICElementDelta delta) {
// ignore workies copies for now // ignore workies copies for now
return; return 0;
/* ICElement elem = delta.getElement(); /* ICElement elem = delta.getElement();
boolean added = (delta.getKind() == ICElementDelta.ADDED); boolean added = (delta.getKind() == ICElementDelta.ADDED);
boolean removed = (delta.getKind() == ICElementDelta.REMOVED); boolean removed = (delta.getKind() == ICElementDelta.REMOVED);
@ -197,6 +214,7 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
} }
public synchronized ITypeCache getCache(IProject project) { public synchronized ITypeCache getCache(IProject project) {
Assert.isNotNull(project);
synchronized(fCacheMap) { synchronized(fCacheMap) {
ITypeCache cache = (ITypeCache) fCacheMap.get(project); ITypeCache cache = (ITypeCache) fCacheMap.get(project);
if (cache == null) { if (cache == null) {
@ -305,11 +323,6 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
return location; return location;
} }
public synchronized void processElementChanged(ElementChangedEvent event, boolean enableIndexing) {
processDelta(event.getDelta());
reconcile(enableIndexing, Job.BUILD, 0);
}
public void addTypeCacheChangedListener(ITypeCacheChangedListener listener) { public void addTypeCacheChangedListener(ITypeCacheChangedListener listener) {
// add listener only if it is not already present // add listener only if it is not already present
synchronized(fChangeListeners) { synchronized(fChangeListeners) {
@ -349,9 +362,11 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
} }
public ITypeInfo getTypeForElement(ICElement element, boolean forceUpdate, boolean forceResolve, boolean enableIndexing, IProgressMonitor monitor) { public ITypeInfo getTypeForElement(ICElement element, boolean forceUpdate, boolean forceResolve, boolean enableIndexing, IProgressMonitor monitor) {
if (element.exists()) {
ITypeInfo cachedInfo = (ITypeInfo) fElementToTypeMap.get(element); ITypeInfo cachedInfo = (ITypeInfo) fElementToTypeMap.get(element);
if (cachedInfo != null && cachedInfo.exists()) if (cachedInfo != null && cachedInfo.exists())
return cachedInfo; return cachedInfo;
}
IQualifiedTypeName qualifiedName = TypeUtil.getFullyQualifiedName(element); IQualifiedTypeName qualifiedName = TypeUtil.getFullyQualifiedName(element);
if (qualifiedName != null) { if (qualifiedName != null) {
@ -383,9 +398,11 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
} }
public ICElement getElementForType(ITypeInfo type, boolean forceUpdate, boolean forceResolve, boolean enableIndexing, IProgressMonitor monitor) { public ICElement getElementForType(ITypeInfo type, boolean forceUpdate, boolean forceResolve, boolean enableIndexing, IProgressMonitor monitor) {
if (type.exists()) {
ICElement cachedElem = (ICElement) fTypeToElementMap.get(type); ICElement cachedElem = (ICElement) fTypeToElementMap.get(type);
if (cachedElem != null && cachedElem.exists()) if (cachedElem != null && cachedElem.exists())
return cachedElem; return cachedElem;
}
IProject project = type.getEnclosingProject(); IProject project = type.getEnclosingProject();
ITypeCache cache = getCache(project); ITypeCache cache = getCache(project);