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);