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:
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.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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue