diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java index 53676cf664f..1b3a9b8a375 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java @@ -78,6 +78,11 @@ public interface IIndexFragment { */ public static final String PROPERTY_FRAGMENT_FORMAT_VERSION= "org.eclipse.cdt.internal.core.index.fragment.format.version"; //$NON-NLS-1$ + /** + * Property key for storing whether indexer has to resume or not. + */ + public static final String PROPERTY_RESUME_INDEXER= "org.eclipse.cdt.internal.core.index.resume"; //$NON-NLS-1$ + /** * Returns the file for the given location and linkage. * May return null, if no such file exists. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java index fd9c19901ad..6081a0a07d9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java @@ -43,6 +43,7 @@ import org.eclipse.cdt.core.parser.ParserUtil; import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.internal.core.dom.AbstractCodeReaderFactory; import org.eclipse.cdt.internal.core.dom.IIncludeFileResolutionHeuristics; +import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IIndexFragmentFile; import org.eclipse.cdt.internal.core.index.IWritableIndex; import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory; @@ -306,6 +307,8 @@ public abstract class AbstractIndexerTask extends PDOMWriter { final ArrayList ifilesToRemove= new ArrayList(); extractFiles(files, ifilesToRemove, monitor); + setResume(true); + // remove files from index removeFilesInIndex(fFilesToRemove, ifilesToRemove, monitor); @@ -313,6 +316,9 @@ public abstract class AbstractIndexerTask extends PDOMWriter { for (int linkageID : getLinkagesToParse()) { parseLinkage(linkageID, files, monitor); } + if (!monitor.isCanceled()) { + setResume(false); + } } finally { fIndex.flush(); } @@ -323,6 +329,15 @@ public abstract class AbstractIndexerTask extends PDOMWriter { } } + private void setResume(boolean value) throws InterruptedException, CoreException { + fIndex.acquireWriteLock(1); + try { + fIndex.getWritableFragment().setProperty(IIndexFragment.PROPERTY_RESUME_INDEXER, String.valueOf(value)); + } finally { + fIndex.releaseWriteLock(1); + } + } + private void extractFiles(Map> files, List iFilesToRemove, IProgressMonitor monitor) throws CoreException { final boolean forceAll= (fUpdateFlags & IIndexManager.UPDATE_ALL) != 0; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexUpdatePolicy.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexUpdatePolicy.java index f9138201500..48fe8b519e9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexUpdatePolicy.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexUpdatePolicy.java @@ -72,35 +72,37 @@ public class IndexUpdatePolicy { return fIndexer; } + public boolean isAutomatic() { + return fKind != MANUAL; + } + public IPDOMIndexerTask handleDelta(ITranslationUnit[] force, ITranslationUnit[] changed, ITranslationUnit[] removed) { if (isNullIndexer()) { return null; } switch(fKind) { - case IndexUpdatePolicy.MANUAL: + case MANUAL: return null; - case IndexUpdatePolicy.POST_CHANGE: + case POST_CHANGE: if (fIndexer != null) { return fIndexer.createTask(force, changed, removed); } break; } - for (int i = 0; i < removed.length; i++) { - ITranslationUnit tu = removed[i]; + for (ITranslationUnit tu : removed) { fForce.remove(tu); fTimestamp.remove(tu); fRemoved.add(tu); } - for (int i = 0; i < force.length; i++) { - ITranslationUnit tu = force[i]; + for (ITranslationUnit tu : force) { fForce.add(tu); fTimestamp.remove(tu); fRemoved.remove(tu); } - for (int i = 0; i < changed.length; i++) { - ITranslationUnit tu = changed[i]; + for (ITranslationUnit element : changed) { + ITranslationUnit tu = element; if (!fForce.contains(tu)) { fTimestamp.add(tu); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java index d7c4d04c59b..4a5cba9e5f7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java @@ -236,8 +236,8 @@ public class PDOMManager implements IWritableIndexManager, IListener { try { ICProject[] projects= model.getCModel().getCProjects(); - for (int i = 0; i < projects.length; i++) { - addProject(projects[i]); + for (ICProject project : projects) { + addProject(project); } } catch (CModelException e) { CCorePlugin.log(e); @@ -517,7 +517,7 @@ public class PDOMManager implements IWritableIndexManager, IListener { return null; } - private void createIndexer(ICProject project, IProgressMonitor pm) { + private void createIndexer(ICProject project, IProgressMonitor pm) throws InterruptedException { assert !Thread.holdsLock(fProjectToPDOM); IProject prj= project.getProject(); try { @@ -540,13 +540,24 @@ public class PDOMManager implements IWritableIndexManager, IListener { } if (!rebuild) { registerIndexer(project, indexer); - IPDOMIndexerTask task= createPolicy(project).createTask(); + IPDOMIndexerTask task= policy.createTask(); if (task != null) { enqueue(task); - } - else { + } else { enqueue(new TriggerNotificationTask(this, pdom)); } + if (policy.isAutomatic()) { + boolean resume= false; + pdom.acquireReadLock(); + try { + resume= "true".equals(pdom.getProperty(IIndexFragment.PROPERTY_RESUME_INDEXER)); //$NON-NLS-1$ + } finally { + pdom.releaseReadLock(); + } + if (resume) { + enqueue(new PDOMUpdateTask(indexer, IIndexManager.UPDATE_CHECK_TIMESTAMPS)); + } + } return; } } @@ -612,8 +623,7 @@ public class PDOMManager implements IWritableIndexManager, IListener { } synchronized (fTaskQueue) { int i=0; - for (Iterator it = fTaskQueue.iterator(); it.hasNext();) { - final IPDOMIndexerTask task= it.next(); + for (IPDOMIndexerTask task : fTaskQueue) { final IPDOMIndexer ti = task.getIndexer(); if (ti != null && referencing.contains(ti.getProject().getProject())) { fTaskQueue.add(i, subjob); @@ -695,7 +705,12 @@ public class PDOMManager implements IWritableIndexManager, IListener { if (project.isOpen() && !postponeSetup(cproject)) { syncronizeProjectSettings(project, new SubProgressMonitor(monitor, 1)); if (getIndexer(cproject) == null) { - createIndexer(cproject, new SubProgressMonitor(monitor, 99)); + try { + createIndexer(cproject, new SubProgressMonitor(monitor, 99)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return Status.CANCEL_STATUS; + } } } return Status.OK_STATUS; @@ -891,8 +906,7 @@ public class PDOMManager implements IWritableIndexManager, IListener { ICProject[] cProjects; try { cProjects = CoreModel.getDefault().getCModel().getCProjects(); - for (int i = 0; i < cProjects.length; i++) { - ICProject project = cProjects[i]; + for (ICProject project : cProjects) { reindex(project); } } catch (CModelException e) { @@ -964,8 +978,8 @@ public class PDOMManager implements IWritableIndexManager, IListener { fIndexerStateEvent.setState(state); Object[] listeners= fStateListeners.getListeners(); monitor.beginTask(Messages.PDOMManager_notifyTask_message, listeners.length); - for (int i = 0; i < listeners.length; i++) { - final IIndexerStateListener listener = (IIndexerStateListener) listeners[i]; + for (Object listener2 : listeners) { + final IIndexerStateListener listener = (IIndexerStateListener) listener2; SafeRunner.run(new ISafeRunnable(){ public void handleException(Throwable exception) { CCorePlugin.log(exception); @@ -1003,8 +1017,8 @@ public class PDOMManager implements IWritableIndexManager, IListener { fIndexChangeEvent.setAffectedProject(finalProject, e); Object[] listeners= fChangeListeners.getListeners(); monitor.beginTask(Messages.PDOMManager_notifyTask_message, listeners.length); - for (int i = 0; i < listeners.length; i++) { - final IIndexChangeListener listener = (IIndexChangeListener) listeners[i]; + for (Object listener2 : listeners) { + final IIndexChangeListener listener = (IIndexChangeListener) listener2; SafeRunner.run(new ISafeRunnable(){ public void handleException(Throwable exception) { CCorePlugin.log(exception); @@ -1326,8 +1340,7 @@ public class PDOMManager implements IWritableIndexManager, IListener { void handlePostBuildEvent() { assert !Thread.holdsLock(fProjectToPDOM); synchronized (fUpdatePolicies) { - for (Iterator i = fUpdatePolicies.values().iterator(); i.hasNext();) { - IndexUpdatePolicy policy= i.next(); + for (IndexUpdatePolicy policy : fUpdatePolicies.values()) { IPDOMIndexerTask task= policy.createTask(); if (task != null) { enqueue(task);