1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

bug 104907 - looping in type cache

This commit is contained in:
Andrew Niefer 2005-07-26 17:56:48 +00:00
parent f9189b1ee4
commit 78680938b8
2 changed files with 31 additions and 29 deletions

View file

@ -28,9 +28,12 @@ import org.eclipse.cdt.core.browser.IWorkingCopyProvider;
import org.eclipse.cdt.core.browser.QualifiedTypeName;
import org.eclipse.cdt.core.browser.TypeInfo;
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.parser.ast.ASTAccessVisibility;
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.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@ -681,25 +684,35 @@ public class TypeCache implements ITypeCache {
if (deltasRemaining() == 0)
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) {
// grab all the remaining deltas
TypeCacheDelta[] jobDeltas = (TypeCacheDelta[]) fDeltas.toArray(new TypeCacheDelta[fDeltas.size()]);
// create a new job
deltaJob = new TypeCacherJob(this, jobDeltas, enableIndexing);
// assign deltas to job
if (jobDeltas != null) {
for (int i = 0; i < jobDeltas.length; ++i) {
jobDeltas[i].assignToJob(deltaJob);
if( haveIndexer ){
// grab all the remaining deltas
TypeCacheDelta[] jobDeltas = (TypeCacheDelta[]) fDeltas.toArray(new TypeCacheDelta[fDeltas.size()]);
// create a new job
deltaJob = new TypeCacherJob(this, jobDeltas, enableIndexing);
// assign deltas to job
if (jobDeltas != null) {
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
deltaJob.addJobChangeListener(fJobChangeListener);
deltaJob.setPriority(priority);
deltaJob.schedule(delay);
if( deltaJob != null ){
// schedule the new job
deltaJob.addJobChangeListener(fJobChangeListener);
deltaJob.setPriority(priority);
deltaJob.schedule(delay);
}
}
public void reconcileAndWait(boolean enableIndexing, int priority, IProgressMonitor monitor) {

View file

@ -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.TypeSearchScope;
import org.eclipse.cdt.core.index.ICDTIndexer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementDelta;
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 {
// flush the cache
boolean success = true;
IProject project = fTypeCache.getProject();
monitor.beginTask("", 100); //$NON-NLS-1$
@ -128,11 +126,11 @@ public class TypeCacherJob extends BasicJob {
fTypeCache.flush(scope);
if (!scope.encloses(project)) {
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();
}
@ -140,23 +138,14 @@ public class TypeCacherJob extends BasicJob {
}
private void update(ITypeSearchScope scope, IProgressMonitor monitor) throws InterruptedException {
boolean success = true;
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$
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();
}