mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-08 02:06:01 +02:00
bug 104907 - looping in type cache
This commit is contained in:
parent
f9189b1ee4
commit
78680938b8
2 changed files with 31 additions and 29 deletions
|
@ -28,9 +28,12 @@ import org.eclipse.cdt.core.browser.IWorkingCopyProvider;
|
||||||
import org.eclipse.cdt.core.browser.QualifiedTypeName;
|
import org.eclipse.cdt.core.browser.QualifiedTypeName;
|
||||||
import org.eclipse.cdt.core.browser.TypeInfo;
|
import org.eclipse.cdt.core.browser.TypeInfo;
|
||||||
import org.eclipse.cdt.core.browser.TypeSearchScope;
|
import org.eclipse.cdt.core.browser.TypeSearchScope;
|
||||||
|
import org.eclipse.cdt.core.index.ICDTIndexer;
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
||||||
import org.eclipse.cdt.internal.core.browser.util.ArrayUtil;
|
import org.eclipse.cdt.internal.core.browser.util.ArrayUtil;
|
||||||
|
import org.eclipse.cdt.internal.core.model.CModelManager;
|
||||||
|
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
@ -681,25 +684,35 @@ public class TypeCache implements ITypeCache {
|
||||||
if (deltasRemaining() == 0)
|
if (deltasRemaining() == 0)
|
||||||
return; // nothing to do
|
return; // nothing to do
|
||||||
|
|
||||||
TypeCacherJob deltaJob;
|
TypeCacherJob deltaJob = null;
|
||||||
|
IndexManager indexManager = CModelManager.getDefault().getIndexManager();
|
||||||
|
ICDTIndexer indexer = indexManager.getIndexerForProject( fProject );
|
||||||
|
boolean haveIndexer = (indexer != null && indexer.isIndexEnabled( fProject ));
|
||||||
synchronized(fDeltas) {
|
synchronized(fDeltas) {
|
||||||
// grab all the remaining deltas
|
if( haveIndexer ){
|
||||||
TypeCacheDelta[] jobDeltas = (TypeCacheDelta[]) fDeltas.toArray(new TypeCacheDelta[fDeltas.size()]);
|
// grab all the remaining deltas
|
||||||
|
TypeCacheDelta[] jobDeltas = (TypeCacheDelta[]) fDeltas.toArray(new TypeCacheDelta[fDeltas.size()]);
|
||||||
// create a new job
|
|
||||||
deltaJob = new TypeCacherJob(this, jobDeltas, enableIndexing);
|
// create a new job
|
||||||
// assign deltas to job
|
deltaJob = new TypeCacherJob(this, jobDeltas, enableIndexing);
|
||||||
if (jobDeltas != null) {
|
// assign deltas to job
|
||||||
for (int i = 0; i < jobDeltas.length; ++i) {
|
if (jobDeltas != null) {
|
||||||
jobDeltas[i].assignToJob(deltaJob);
|
for (int i = 0; i < jobDeltas.length; ++i) {
|
||||||
|
jobDeltas[i].assignToJob(deltaJob);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
//we don't have an indexer, don't create a job to do these deltas, throw them away
|
||||||
|
fDeltas.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// schedule the new job
|
if( deltaJob != null ){
|
||||||
deltaJob.addJobChangeListener(fJobChangeListener);
|
// schedule the new job
|
||||||
deltaJob.setPriority(priority);
|
deltaJob.addJobChangeListener(fJobChangeListener);
|
||||||
deltaJob.schedule(delay);
|
deltaJob.setPriority(priority);
|
||||||
|
deltaJob.schedule(delay);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reconcileAndWait(boolean enableIndexing, int priority, IProgressMonitor monitor) {
|
public void reconcileAndWait(boolean enableIndexing, int priority, IProgressMonitor monitor) {
|
||||||
|
|
|
@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.core.browser.cache;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.browser.ITypeSearchScope;
|
import org.eclipse.cdt.core.browser.ITypeSearchScope;
|
||||||
import org.eclipse.cdt.core.browser.TypeSearchScope;
|
import org.eclipse.cdt.core.browser.TypeSearchScope;
|
||||||
import org.eclipse.cdt.core.index.ICDTIndexer;
|
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
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.search.ICSearchConstants;
|
import org.eclipse.cdt.core.search.ICSearchConstants;
|
||||||
|
@ -120,7 +119,6 @@ public class TypeCacherJob extends BasicJob {
|
||||||
|
|
||||||
private void flush(ITypeSearchScope scope, IProgressMonitor monitor) throws InterruptedException {
|
private void flush(ITypeSearchScope scope, IProgressMonitor monitor) throws InterruptedException {
|
||||||
// flush the cache
|
// flush the cache
|
||||||
boolean success = true;
|
|
||||||
IProject project = fTypeCache.getProject();
|
IProject project = fTypeCache.getProject();
|
||||||
|
|
||||||
monitor.beginTask("", 100); //$NON-NLS-1$
|
monitor.beginTask("", 100); //$NON-NLS-1$
|
||||||
|
@ -128,11 +126,11 @@ public class TypeCacherJob extends BasicJob {
|
||||||
fTypeCache.flush(scope);
|
fTypeCache.flush(scope);
|
||||||
if (!scope.encloses(project)) {
|
if (!scope.encloses(project)) {
|
||||||
if (project.exists() && project.isOpen()) {
|
if (project.exists() && project.isOpen()) {
|
||||||
success = doIndexerJob(new IndexerDependenciesJob(fIndexManager, fTypeCache, scope), monitor);
|
doIndexerJob(new IndexerDependenciesJob(fIndexManager, fTypeCache, scope), monitor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!success || monitor.isCanceled()) {
|
if ( monitor.isCanceled() ) {
|
||||||
throw new InterruptedException();
|
throw new InterruptedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,23 +138,14 @@ public class TypeCacherJob extends BasicJob {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void update(ITypeSearchScope scope, IProgressMonitor monitor) throws InterruptedException {
|
private void update(ITypeSearchScope scope, IProgressMonitor monitor) throws InterruptedException {
|
||||||
boolean success = true;
|
|
||||||
IProject project = fTypeCache.getProject();
|
IProject project = fTypeCache.getProject();
|
||||||
|
|
||||||
//A query on the null indexer will look like a canceled or failed job, which will cause us
|
|
||||||
//to try again later, don't even try in that case.
|
|
||||||
ICDTIndexer indexer = fIndexManager.getIndexerForProject( project );
|
|
||||||
if( indexer == null || !indexer.isIndexEnabled( project ) ){
|
|
||||||
monitor.done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
monitor.beginTask("", 100); //$NON-NLS-1$
|
monitor.beginTask("", 100); //$NON-NLS-1$
|
||||||
if (project.exists() && project.isOpen()) {
|
if (project.exists() && project.isOpen()) {
|
||||||
success = doIndexerJob(new IndexerTypesJob2(fIndexManager, fTypeCache, scope), monitor);
|
doIndexerJob(new IndexerTypesJob2(fIndexManager, fTypeCache, scope), monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!success || monitor.isCanceled()) {
|
if (monitor.isCanceled()) {
|
||||||
throw new InterruptedException();
|
throw new InterruptedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue