diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CModelListener.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CModelListener.java
index 259f24fb536..a99421a151a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CModelListener.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/CModelListener.java
@@ -17,13 +17,15 @@ import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IElementChangedListener;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.runtime.CoreException;
/**
* CModel listener used for the PDOMManager.
* @since 4.0
*/
-public class CModelListener implements IElementChangedListener {
+public class CModelListener implements IElementChangedListener, IResourceChangeListener {
private PDOMManager fManager;
@@ -58,7 +60,7 @@ public class CModelListener implements IElementChangedListener {
final ICProject project = (ICProject)delta.getElement();
switch (delta.getKind()) {
case ICElementDelta.ADDED:
- fManager.addProject(project.getProject());
+ fManager.addProject(project);
break;
case ICElementDelta.CHANGED:
fManager.changeProject(project, delta);
@@ -69,4 +71,10 @@ public class CModelListener implements IElementChangedListener {
}
}
}
+
+ public void resourceChanged(IResourceChangeEvent event) {
+ if (event.getType() == IResourceChangeEvent.POST_BUILD) {
+ fManager.handlePostBuildEvent();
+ }
+ }
}
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
new file mode 100644
index 00000000000..c874c7de3e2
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexUpdatePolicy.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.pdom;
+
+import java.util.HashSet;
+
+import org.eclipse.cdt.core.dom.IPDOMIndexer;
+import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
+import org.eclipse.cdt.core.dom.IPDOMManager;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.ITranslationUnit;
+
+public class IndexUpdatePolicy {
+
+ public static final int POST_CHANGE = 0;
+ public static final int POST_BUILD = 1;
+ public static final int MANUAL= 2;
+
+ private final ICProject fCProject;
+ private int fKind;
+
+ private HashSet fAdded= new HashSet();
+ private HashSet fChanged= new HashSet();
+ private HashSet fRemoved= new HashSet();
+ private IPDOMIndexer fIndexer;
+
+ public IndexUpdatePolicy(ICProject project, int kind) {
+ fCProject= project;
+ fKind= kind;
+ }
+
+ public ICProject getProject() {
+ return fCProject;
+ }
+
+ public int getKind() {
+ return fKind;
+ }
+
+ public IPDOMIndexerTask addDelta(ITranslationUnit[] added, ITranslationUnit[] changed,
+ ITranslationUnit[] removed) {
+ if (fIndexer != null && fIndexer.getID().equals(IPDOMManager.ID_NO_INDEXER)) {
+ return null;
+ }
+
+ switch(fKind) {
+ case IndexUpdatePolicy.MANUAL:
+ return null;
+ case IndexUpdatePolicy.POST_CHANGE:
+ if (fIndexer != null) {
+ return fIndexer.createTask(added, changed, removed);
+ }
+ break;
+ }
+
+ for (int i = 0; i < removed.length; i++) {
+ ITranslationUnit tu = removed[i];
+ fAdded.remove(tu);
+ fChanged.remove(tu);
+ fRemoved.add(tu);
+ }
+ for (int i = 0; i < added.length; i++) {
+ ITranslationUnit tu = added[i];
+ if (!fChanged.contains(tu)) {
+ fAdded.add(tu);
+ }
+ fRemoved.remove(tu);
+ }
+ for (int i = 0; i < changed.length; i++) {
+ ITranslationUnit tu = changed[i];
+ if (!fAdded.contains(tu)) {
+ fChanged.add(tu);
+ }
+ fRemoved.remove(tu);
+ }
+ return null;
+ }
+
+ public void clearTUs() {
+ fAdded.clear();
+ fChanged.clear();
+ fRemoved.clear();
+ }
+
+ public boolean hasTUs() {
+ return !(fAdded.isEmpty() && fChanged.isEmpty() && fRemoved.isEmpty());
+ }
+
+ public IPDOMIndexerTask createTask() {
+ if (fIndexer != null && hasTUs()) {
+ if (getKind() != IndexUpdatePolicy.MANUAL &&
+ !fIndexer.getID().equals(IPDOMManager.ID_NO_INDEXER)) {
+ return fIndexer.createTask(getAdded(), getChanged(), getRemoved());
+ }
+ clearTUs();
+ }
+ return null;
+ }
+
+ private ITranslationUnit[] getAdded() {
+ return (ITranslationUnit[]) fAdded.toArray(new ITranslationUnit[fAdded.size()]);
+ }
+
+ private ITranslationUnit[] getChanged() {
+ return (ITranslationUnit[]) fChanged.toArray(new ITranslationUnit[fChanged.size()]);
+ }
+
+ private ITranslationUnit[] getRemoved() {
+ return (ITranslationUnit[]) fRemoved.toArray(new ITranslationUnit[fRemoved.size()]);
+ }
+
+ public void setIndexer(IPDOMIndexer indexer) {
+ fIndexer= indexer;
+ }
+
+ public IPDOMIndexer getIndexer() {
+ return fIndexer;
+ }
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMIndexerJob.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMIndexerJob.java
index 07acd21b163..086d08329d6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMIndexerJob.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMIndexerJob.java
@@ -149,16 +149,19 @@ public class PDOMIndexerJob extends Job {
return monitorJob;
}
- public void cancelJobs(IPDOMIndexer indexer) {
+ public void cancelJobs(IPDOMIndexer indexer, boolean waitUntilCancelled) {
synchronized (taskMutex) {
- if (currentTask != null && currentTask.getIndexer() == indexer) {
+ if (currentTask != null &&
+ (indexer == null || currentTask.getIndexer() == indexer)) {
fMonitor.setCanceled(true);
cancelledByManager = true;
- while (currentTask != null && currentTask.getIndexer() == indexer) {
- try {
- taskMutex.wait();
- } catch (InterruptedException e) {
- return;
+ if (waitUntilCancelled) {
+ while (currentTask != null && currentTask.getIndexer() == indexer) {
+ try {
+ taskMutex.wait();
+ } catch (InterruptedException e) {
+ return;
+ }
}
}
}
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 21967b19c79..cf59b037f71 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
@@ -38,12 +38,12 @@ import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexChangeListener;
import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.IIndexerStateListener;
+import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.core.model.IElementChangedListener;
import org.eclipse.cdt.core.model.ILanguageMappingChangeListener;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.LanguageManager;
@@ -58,9 +58,9 @@ import org.eclipse.cdt.internal.core.index.provider.IndexProviderManager;
import org.eclipse.cdt.internal.core.pdom.PDOM.IListener;
import org.eclipse.cdt.internal.core.pdom.db.ChunkCache;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMProjectIndexLocationConverter;
+import org.eclipse.cdt.internal.core.pdom.indexer.DeltaAnalyzer;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMRebuildTask;
-import org.eclipse.cdt.internal.core.pdom.indexer.PDOMResourceDeltaTask;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMUpdateTask;
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
import org.eclipse.core.resources.IFolder;
@@ -98,8 +98,6 @@ import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChange
*/
public class PDOMManager implements IWritableIndexManager, IListener {
- private static final String SETTINGS_FOLDER_NAME = ".settings"; //$NON-NLS-1$
-
private static final class PerInstanceSchedulingRule implements ISchedulingRule {
public boolean contains(ISchedulingRule rule) {
return rule == this;
@@ -120,7 +118,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
- private static final QualifiedName indexerProperty= new QualifiedName(CCorePlugin.PLUGIN_ID, "pdomIndexer"); //$NON-NLS-1$
+ private static final String SETTINGS_FOLDER_NAME = ".settings"; //$NON-NLS-1$
private static final QualifiedName dbNameProperty= new QualifiedName(CCorePlugin.PLUGIN_ID, "pdomName"); //$NON-NLS-1$
private static final ISchedulingRule NOTIFICATION_SCHEDULING_RULE = new PerInstanceSchedulingRule();
@@ -147,17 +145,17 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private IndexChangeEvent fIndexChangeEvent= new IndexChangeEvent();
private IndexerStateEvent fIndexerStateEvent= new IndexerStateEvent();
- private IElementChangedListener fCModelListener= new CModelListener(this);
+ private CModelListener fCModelListener= new CModelListener(this);
private ILanguageMappingChangeListener fLanguageChangeListener = new LanguageMappingChangeListener(this);
private IndexFactory fIndexFactory= new IndexFactory(this);
- private IndexProviderManager manager = new IndexProviderManager();
+ private IndexProviderManager fIndexProviderManager = new IndexProviderManager();
/**
* Serializes creation of new indexer, when acquiring the lock you are
* not allowed to hold a lock on fPDOMs.
*/
- private Object fIndexerMutex= new Object();
+ private HashMap fUpdatePolicies= new HashMap();
private HashMap fPrefListeners= new HashMap();
/**
@@ -171,13 +169,34 @@ public class PDOMManager implements IWritableIndexManager, IListener {
initializeDatabaseCache();
final CoreModel model = CoreModel.getDefault();
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(fCModelListener);
model.addElementChangedListener(fCModelListener);
LanguageManager.getInstance().registerLanguageChangeListener(fLanguageChangeListener);
- IProject[] projects= ResourcesPlugin.getWorkspace().getRoot().getProjects();
- for (int i = 0; i < projects.length; i++) {
- IProject project = projects[i];
- addProject(project);
+ try {
+ ICProject[] projects= model.getCModel().getCProjects();
+ for (int i = 0; i < projects.length; i++) {
+ addProject(projects[i]);
+ }
+ } catch (CModelException e) {
+ CCorePlugin.log(e);
+ }
+ }
+
+ public void shutdown() {
+ final CoreModel model = CoreModel.getDefault();
+ model.removeElementChangedListener(fCModelListener);
+ ResourcesPlugin.getWorkspace().removeResourceChangeListener(fCModelListener);
+ LanguageManager.getInstance().unregisterLanguageChangeListener(fLanguageChangeListener);
+ PDOMIndexerJob jobToCancel= null;
+ synchronized (fTaskQueueMutex) {
+ fTaskQueue.clear();
+ jobToCancel= fIndexerJob;
+ }
+
+ if (jobToCancel != null) {
+ assert !Thread.holdsLock(fTaskQueueMutex);
+ jobToCancel.cancelJobs(null, false);
}
}
@@ -208,7 +227,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
public IndexProviderManager getIndexProviderManager() {
- return manager;
+ return fIndexProviderManager;
}
/**
@@ -230,16 +249,22 @@ public class PDOMManager implements IWritableIndexManager, IListener {
File dbFile= null;
if (dbName != null) {
dbFile= fileFromDatabaseName(dbName);
- ICProject currentCOwner= (ICProject) fFileToProject.get(dbFile);
- if (currentCOwner != null) {
- IProject currentOwner= currentCOwner.getProject();
- if (currentOwner.exists()) {
- dbName= null;
- dbFile= null;
- }
- else {
- pdom= (WritablePDOM) fProjectToPDOM.remove(currentOwner);
- fFileToProject.remove(dbFile);
+ if (!dbFile.exists()) {
+ dbFile= null;
+ dbName= null;
+ }
+ else {
+ ICProject currentCOwner= (ICProject) fFileToProject.get(dbFile);
+ if (currentCOwner != null) {
+ IProject currentOwner= currentCOwner.getProject();
+ if (currentOwner.exists()) {
+ dbName= null;
+ dbFile= null;
+ }
+ else {
+ pdom= (WritablePDOM) fProjectToPDOM.remove(currentOwner);
+ fFileToProject.remove(dbFile);
+ }
}
}
}
@@ -343,7 +368,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
String newid= IndexerPreferences.get(prj, IndexerPreferences.KEY_INDEXER_ID, IPDOMManager.ID_NO_INDEXER);
Properties props= IndexerPreferences.getProperties(prj);
- synchronized (fIndexerMutex) {
+ synchronized (fUpdatePolicies) {
oldIndexer= getIndexer(cproject);
if (oldIndexer != null) {
if (oldIndexer.getID().equals(newid)) {
@@ -354,6 +379,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
IPDOMIndexer indexer= createIndexer(cproject, newid, props);
registerIndexer(cproject, indexer);
+ createPolicy(cproject).clearTUs();
enqueue(new PDOMRebuildTask(indexer));
}
}
@@ -364,41 +390,28 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
private void registerIndexer(ICProject project, IPDOMIndexer indexer) throws CoreException {
- assert Thread.holdsLock(fIndexerMutex);
+ assert Thread.holdsLock(fUpdatePolicies);
indexer.setProject(project);
registerPreferenceListener(project);
- project.getProject().setSessionProperty(indexerProperty, indexer);
+ createPolicy(project).setIndexer(indexer);
}
private IPDOMIndexer getIndexer(ICProject project) {
assert !Thread.holdsLock(fProjectToPDOM);
- synchronized (fIndexerMutex) {
- IProject prj = project.getProject();
- if (!prj.isOpen()) {
- return null;
+ synchronized (fUpdatePolicies) {
+ IndexUpdatePolicy policy= getPolicy(project);
+ if (policy != null) {
+ return policy.getIndexer();
}
-
- IPDOMIndexer indexer;
- try {
- indexer = (IPDOMIndexer)prj.getSessionProperty(indexerProperty);
- } catch (CoreException e) {
- CCorePlugin.log(e);
- return null;
- }
-
- if (indexer != null && indexer.getProject().equals(project)) {
- return indexer;
- }
-
- return null;
}
+ return null;
}
private void createIndexer(ICProject project, IProgressMonitor pm) {
assert !Thread.holdsLock(fProjectToPDOM);
IProject prj= project.getProject();
try {
- synchronized (fIndexerMutex) {
+ synchronized (fUpdatePolicies) {
WritablePDOM pdom= (WritablePDOM) getPDOM(project);
Properties props= IndexerPreferences.getProperties(prj);
IPDOMIndexer indexer= createIndexer(project, getIndexerId(project), props);
@@ -415,22 +428,27 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
if (!rebuild) {
registerIndexer(project, indexer);
+ IPDOMIndexerTask task= createPolicy(project).createTask();
+ if (task != null) {
+ enqueue(task);
+ }
return;
}
}
-
- // perform import
+
+ // rebuild is required, try import first.
TeamPDOMImportOperation operation= new TeamPDOMImportOperation(project);
operation.run(pm);
- synchronized (fIndexerMutex) {
+ synchronized (fUpdatePolicies) {
Properties props= IndexerPreferences.getProperties(prj);
- IPDOMIndexer indexer= createIndexer(project, getIndexerId(project), props);
-
+ IPDOMIndexer indexer = createIndexer(project, getIndexerId(project), props);
registerIndexer(project, indexer);
+ createPolicy(project).clearTUs();
+
IPDOMIndexerTask task= null;
if (operation.wasSuccessful()) {
- task= new PDOMUpdateTask(indexer);
+ task= new PDOMUpdateTask(indexer, true);
}
else {
task= new PDOMRebuildTask(indexer);
@@ -526,18 +544,16 @@ public class PDOMManager implements IWritableIndexManager, IListener {
return fCurrentTask == null && fTaskQueue.isEmpty();
}
}
-
- public void addProject(final IProject project) {
+
+ void addProject(final ICProject cproject) {
+ final IProject project = cproject.getProject();
Job addProject= new Job(Messages.PDOMManager_StartJob_name) {
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask("", 100); //$NON-NLS-1$
- if (project.isOpen() && CoreModel.hasCNature(project)) {
- ICProject cproject= CoreModel.getDefault().create(project);
- if (cproject != null) {
- syncronizeProjectSettings(project, new SubProgressMonitor(monitor, 1));
- if (getIndexer(cproject) == null) {
- createIndexer(cproject, new SubProgressMonitor(monitor, 99));
- }
+ if (project.isOpen()) {
+ syncronizeProjectSettings(project, new SubProgressMonitor(monitor, 1));
+ if (getIndexer(cproject) == null) {
+ createIndexer(cproject, new SubProgressMonitor(monitor, 99));
}
}
return Status.OK_STATUS;
@@ -590,34 +606,66 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
}
- public void changeProject(ICProject project, ICElementDelta delta) throws CoreException {
+ void changeProject(ICProject project, ICElementDelta delta) throws CoreException {
+ assert !Thread.holdsLock(fProjectToPDOM);
IPDOMIndexer indexer = getIndexer(project);
- if (indexer != null) {
- PDOMResourceDeltaTask resourceDeltaTask = new PDOMResourceDeltaTask(indexer, delta);
- if (!resourceDeltaTask.isEmpty()) {
- enqueue(resourceDeltaTask);
+ if (indexer != null && indexer.getID().equals(IPDOMManager.ID_NO_INDEXER)) {
+ return;
+ }
+
+ boolean allFiles= IndexerPreferences.getIndexAllFiles(project.getProject());
+ DeltaAnalyzer deltaAnalyzer = new DeltaAnalyzer(allFiles);
+ deltaAnalyzer.analyzeDelta(delta);
+ ITranslationUnit[] added= deltaAnalyzer.getAddedTUs();
+ ITranslationUnit[] changed= deltaAnalyzer.getChangedTUs();
+ ITranslationUnit[] removed= deltaAnalyzer.getRemovedTUs();
+ if (added.length > 0 || changed.length > 0 || removed.length > 0) {
+ synchronized (fUpdatePolicies) {
+ IndexUpdatePolicy policy= createPolicy(project);
+ IPDOMIndexerTask task= policy.addDelta(added, changed, removed);
+ if (task != null) {
+ enqueue(task);
+ }
}
}
}
+ private IndexUpdatePolicy createPolicy(final ICProject project) {
+ assert !Thread.holdsLock(fProjectToPDOM);
+ synchronized (fUpdatePolicies) {
+ IndexUpdatePolicy policy= (IndexUpdatePolicy) fUpdatePolicies.get(project);
+ if (policy == null) {
+ policy= new IndexUpdatePolicy(project, IndexerPreferences.getUpdatePolicy(project.getProject()));
+ fUpdatePolicies.put(project, policy);
+ }
+ return policy;
+ }
+ }
+
+ private IndexUpdatePolicy getPolicy(final ICProject project) {
+ synchronized (fUpdatePolicies) {
+ return (IndexUpdatePolicy) fUpdatePolicies.get(project);
+ }
+ }
+
public void deleteProject(ICProject cproject) {
- removeProject(cproject, true);
+ removeProject(cproject, true);
}
public void closeProject(ICProject cproject) {
removeProject(cproject, false);
}
-
- private void removeProject(ICProject project, final boolean delete) {
- IPDOMIndexer indexer= getIndexer(project);
+ private void removeProject(ICProject cproject, final boolean delete) {
+ assert !Thread.holdsLock(fProjectToPDOM);
+ IPDOMIndexer indexer= getIndexer(cproject);
if (indexer != null) {
stopIndexer(indexer);
}
- unregisterPreferenceListener(project);
+ unregisterPreferenceListener(cproject);
WritablePDOM pdom= null;
synchronized (fProjectToPDOM) {
- IProject rproject= project.getProject();
+ IProject rproject= cproject.getProject();
pdom = (WritablePDOM) fProjectToPDOM.remove(rproject);
if (pdom != null) {
fFileToProject.remove(pdom.getDB().getLocation());
@@ -649,22 +697,22 @@ public class PDOMManager implements IWritableIndexManager, IListener {
job.setSystem(true);
job.schedule();
}
+
+ synchronized (fUpdatePolicies) {
+ fUpdatePolicies.remove(cproject);
+ }
}
private void stopIndexer(IPDOMIndexer indexer) {
+ assert !Thread.holdsLock(fProjectToPDOM);
ICProject project= indexer.getProject();
- synchronized (fIndexerMutex) {
- IProject rp= project.getProject();
- if (rp.isOpen()) {
- try {
- if (rp.getSessionProperty(indexerProperty) == indexer) {
- rp.setSessionProperty(indexerProperty, null);
- }
+ synchronized (fUpdatePolicies) {
+ IndexUpdatePolicy policy= getPolicy(project);
+ if (policy != null) {
+ if (policy.getIndexer() == indexer) {
+ policy.setIndexer(null);
}
- catch (CoreException e) {
- CCorePlugin.log(e);
- }
- }
+ }
}
cancelIndexerJobs(indexer);
}
@@ -683,14 +731,14 @@ public class PDOMManager implements IWritableIndexManager, IListener {
if (jobToCancel != null) {
assert !Thread.holdsLock(fTaskQueueMutex);
- jobToCancel.cancelJobs(indexer);
+ jobToCancel.cancelJobs(indexer, true);
}
}
public void reindex(ICProject project) throws CoreException {
assert !Thread.holdsLock(fProjectToPDOM);
IPDOMIndexer indexer= null;
- synchronized (fIndexerMutex) {
+ synchronized (fUpdatePolicies) {
indexer= getIndexer(project);
}
// don't attempt to hold lock on indexerMutex while cancelling
@@ -698,9 +746,10 @@ public class PDOMManager implements IWritableIndexManager, IListener {
cancelIndexerJobs(indexer);
}
- synchronized(fIndexerMutex) {
+ synchronized(fUpdatePolicies) {
indexer= getIndexer(project);
if (indexer != null) {
+ createPolicy(project).clearTUs();
enqueue(new PDOMRebuildTask(indexer));
}
}
@@ -1127,10 +1176,9 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
else {
assert !Thread.holdsLock(fProjectToPDOM);
- synchronized (fIndexerMutex) {
+ synchronized (fUpdatePolicies) {
IPDOMIndexer indexer= getIndexer(project);
- PDOMUpdateTask task= new PDOMUpdateTask(indexer);
- task.setCheckTimestamps(timestamps);
+ PDOMUpdateTask task= new PDOMUpdateTask(indexer, timestamps);
task.setTranslationUnitSelection(filesAndFolders);
if (indexer != null) {
enqueue(task);
@@ -1139,4 +1187,16 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
}
+ void handlePostBuildEvent() {
+ assert !Thread.holdsLock(fProjectToPDOM);
+ synchronized (fUpdatePolicies) {
+ for (Iterator i = fUpdatePolicies.values().iterator(); i.hasNext();) {
+ IndexUpdatePolicy policy= (IndexUpdatePolicy) i.next();
+ IPDOMIndexerTask task= policy.createTask();
+ if (task != null) {
+ enqueue(task);
+ }
+ }
+ }
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMProjectIndexLocationConverter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMProjectIndexLocationConverter.java
index b42e8137dcf..1ef8d83dde6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMProjectIndexLocationConverter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMProjectIndexLocationConverter.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006 Symbian Software Ltd. and others.
+ * Copyright (c) 2006, 2007 Symbian Software Ltd. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* Andrew Ferguson (Symbian) - initial API and implementation
+ * Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom;
@@ -50,7 +51,7 @@ public class PDOMProjectIndexLocationConverter implements IIndexLocationConverte
IResource member= root.getFile(new Path(raw));
uri = member.getLocationURI();
}
- return new IndexFileLocation(uri, fullPath);
+ return uri == null ? null : new IndexFileLocation(uri, fullPath);
}
/* (non-Javadoc)
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/DeltaAnalyzer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/DeltaAnalyzer.java
new file mode 100644
index 00000000000..e1601a2d0d5
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/DeltaAnalyzer.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.pdom.indexer;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.cdt.core.model.ICContainer;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ICElementDelta;
+import org.eclipse.cdt.core.model.ITranslationUnit;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+
+public class DeltaAnalyzer {
+ private boolean fAllFiles;
+ private List fAdded= new ArrayList();
+ private List fChanged= new ArrayList();
+ private List fRemoved= new ArrayList();
+
+ public DeltaAnalyzer(boolean allFiles) {
+ fAllFiles= allFiles;
+ }
+
+ public void analyzeDelta(ICElementDelta delta) throws CoreException {
+ processDelta(delta);
+ }
+
+ private void processDelta(ICElementDelta delta) throws CoreException {
+ int flags = delta.getFlags();
+
+ if ((flags & ICElementDelta.F_CHILDREN) != 0) {
+ ICElementDelta[] children = delta.getAffectedChildren();
+ for (int i = 0; i < children.length; ++i) {
+ processDelta(children[i]);
+ }
+ }
+
+ ICElement element = delta.getElement();
+ switch (element.getElementType()) {
+ case ICElement.C_UNIT:
+ ITranslationUnit tu = (ITranslationUnit)element;
+ if (!tu.isWorkingCopy()) {
+ switch (delta.getKind()) {
+ case ICElementDelta.CHANGED:
+ if ((flags & ICElementDelta.F_CONTENT) != 0) {
+ if (fAllFiles || !CoreModel.isScannerInformationEmpty(tu.getResource()) || tu.isHeaderUnit()) {
+ fChanged.add(tu);
+ }
+ }
+ break;
+ case ICElementDelta.ADDED:
+ if (fAllFiles || !CoreModel.isScannerInformationEmpty(tu.getResource()) || tu.isHeaderUnit()) {
+ fAdded.add(tu);
+ }
+ break;
+ case ICElementDelta.REMOVED:
+ fRemoved.add(tu);
+ break;
+ }
+ }
+ break;
+ case ICElement.C_CCONTAINER:
+ ICContainer folder= (ICContainer) element;
+ if (delta.getKind() == ICElementDelta.ADDED) {
+ collectSources(folder, fAdded);
+ }
+ break;
+ }
+ }
+
+ private void collectSources(ICContainer container, Collection sources) throws CoreException {
+ container.accept(new TranslationUnitCollector(sources, sources, fAllFiles, new NullProgressMonitor()));
+ }
+
+ public ITranslationUnit[] getAddedTUs() {
+ return (ITranslationUnit[]) fAdded.toArray(new ITranslationUnit[fAdded.size()]);
+ }
+
+ public ITranslationUnit[] getChangedTUs() {
+ return (ITranslationUnit[]) fChanged.toArray(new ITranslationUnit[fChanged.size()]);
+ }
+
+ public ITranslationUnit[] getRemovedTUs() {
+ return (ITranslationUnit[]) fRemoved.toArray(new ITranslationUnit[fRemoved.size()]);
+ }
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/IndexerPreferences.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/IndexerPreferences.java
index 556993c6fd7..8394ac311a7 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/IndexerPreferences.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/IndexerPreferences.java
@@ -19,6 +19,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.LocalProjectScope;
+import org.eclipse.cdt.internal.core.pdom.IndexUpdatePolicy;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.Platform;
@@ -45,14 +46,17 @@ public class IndexerPreferences {
public static final String KEY_FILES_TO_PARSE_UP_FRONT= "filesToParseUpFront"; //$NON-NLS-1$
public static final String KEY_SKIP_ALL_REFERENCES= "skipReferences"; //$NON-NLS-1$
public static final String KEY_SKIP_TYPE_REFERENCES= "skipTypeReferences"; //$NON-NLS-1$
+
+ private static final String KEY_INDEXER_PREFS_SCOPE = "preferenceScope"; //$NON-NLS-1$
+ private static final String KEY_INDEX_IMPORT_LOCATION = "indexImportLocation"; //$NON-NLS-1$
+ private static final String KEY_UPDATE_POLICY= "updatePolicy"; //$NON-NLS-1$
private static final String DEFAULT_INDEX_IMPORT_LOCATION = ".settings/cdt-index.zip"; //$NON-NLS-1$
private static final String DEFAULT_FILES_TO_PARSE_UP_FRONT= "stdarg.h, stddef.h, sys/types.h"; //$NON-NLS-1$
+ private static final int DEFAULT_UPDATE_POLICY= 0;
private static final String QUALIFIER = CCorePlugin.PLUGIN_ID;
private static final String INDEXER_NODE = "indexer"; //$NON-NLS-1$
- private static final String KEY_INDEXER_PREFS_SCOPE = "preferenceScope"; //$NON-NLS-1$
- private static final String KEY_INDEX_IMPORT_LOCATION = "indexImportLocation"; //$NON-NLS-1$
/**
@@ -344,4 +348,43 @@ public class IndexerPreferences {
CCoreInternals.savePreferences(project);
}
}
+
+ public static int getUpdatePolicy(IProject project) {
+ Preferences[] prefs;
+ if (project != null) {
+ prefs= new Preferences[] {
+ getProjectPreferences(project),
+ getInstancePreferences(),
+ getConfigurationPreferences(),
+ getDefaultPreferences()
+ };
+ }
+ else {
+ prefs= new Preferences[] {
+ getInstancePreferences(),
+ getConfigurationPreferences(),
+ getDefaultPreferences()
+ };
+ }
+ String val= Platform.getPreferencesService().get(KEY_UPDATE_POLICY, null, prefs);
+ if (val != null) {
+ try {
+ int result= Integer.parseInt(val);
+ switch(result) {
+ case IndexUpdatePolicy.POST_CHANGE:
+ case IndexUpdatePolicy.POST_BUILD:
+ case IndexUpdatePolicy.MANUAL:
+ return result;
+ }
+ }
+ catch (Exception e) {
+ CCorePlugin.log(e);
+ }
+ }
+ return DEFAULT_UPDATE_POLICY;
+ }
+
+ public static boolean getIndexAllFiles(IProject project) {
+ return "true".equals(IndexerPreferences.get(project.getProject(), IndexerPreferences.KEY_INDEX_ALL_FILES, null)); //$NON-NLS-1$
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMResourceDeltaTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMResourceDeltaTask.java
deleted file mode 100644
index 3c34a1b3a83..00000000000
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMResourceDeltaTask.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Wind River Systems, Inc. and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Markus Schorn - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.cdt.internal.core.pdom.indexer;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.IPDOMIndexer;
-import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
-import org.eclipse.cdt.core.dom.IPDOMManager;
-import org.eclipse.cdt.core.index.IIndex;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICContainer;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.core.model.ICElementDelta;
-import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.internal.core.pdom.IndexerProgress;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-public class PDOMResourceDeltaTask implements IPDOMIndexerTask {
- private static final String TRUE = String.valueOf(true);
-
- final private IPDOMIndexer fIndexer;
- final private boolean fAllFiles;
- final private IPDOMIndexerTask fDelegate;
- final private IndexerProgress fProgress;
-
- private IIndex fIndex;
-
- public PDOMResourceDeltaTask(IPDOMIndexer indexer, ICElementDelta delta) throws CoreException {
- fIndexer= indexer;
- fProgress= new IndexerProgress();
- fAllFiles= TRUE.equals(getIndexer().getProperty(IndexerPreferences.KEY_INDEX_ALL_FILES));
- if (!IPDOMManager.ID_NO_INDEXER.equals(fIndexer.getID())) {
- List a= new ArrayList();
- List c= new ArrayList();
- List r= new ArrayList();
-
- fIndex= CCorePlugin.getIndexManager().getIndex(indexer.getProject());
- try {
- fIndex.acquireReadLock();
- } catch (InterruptedException e) {
- fDelegate= null;
- return;
- }
- try {
- processDelta(delta, a, c, r, new NullProgressMonitor());
- if (!a.isEmpty() || !c.isEmpty() || !r.isEmpty()) {
- ITranslationUnit[] aa= (ITranslationUnit[]) a.toArray(new ITranslationUnit[a.size()]);
- ITranslationUnit[] ca= (ITranslationUnit[]) c.toArray(new ITranslationUnit[c.size()]);
- ITranslationUnit[] ra= (ITranslationUnit[]) r.toArray(new ITranslationUnit[r.size()]);
- fDelegate= indexer.createTask(aa, ca, ra);
- if (fDelegate instanceof PDOMIndexerTask) {
- ((PDOMIndexerTask) fDelegate).setCheckTimestamps(true);
- }
- }
- else {
- fDelegate= null;
- }
- }
- finally {
- fIndex.releaseReadLock();
- }
- }
- else {
- fDelegate= null;
- }
- }
-
- private void processDelta(ICElementDelta delta, List added, List changed, List removed, IProgressMonitor pm) throws CoreException {
- int flags = delta.getFlags();
-
- if ((flags & ICElementDelta.F_CHILDREN) != 0) {
- ICElementDelta[] children = delta.getAffectedChildren();
- for (int i = 0; i < children.length; ++i) {
- processDelta(children[i], added, changed, removed, pm);
- }
- }
-
- ICElement element = delta.getElement();
- switch (element.getElementType()) {
- case ICElement.C_UNIT:
- ITranslationUnit tu = (ITranslationUnit)element;
- if (!tu.isWorkingCopy()) {
- switch (delta.getKind()) {
- case ICElementDelta.CHANGED:
- if ((flags & ICElementDelta.F_CONTENT) != 0) {
- if (fAllFiles || !CoreModel.isScannerInformationEmpty(tu.getResource()) || tu.isHeaderUnit()) {
- changed.add(tu);
- }
- }
- break;
- case ICElementDelta.ADDED:
- if (fAllFiles || !CoreModel.isScannerInformationEmpty(tu.getResource()) || tu.isHeaderUnit()) {
- added.add(tu);
- }
- break;
- case ICElementDelta.REMOVED:
- removed.add(tu);
- break;
- }
- }
- break;
- case ICElement.C_CCONTAINER:
- ICContainer folder= (ICContainer) element;
- if (delta.getKind() == ICElementDelta.ADDED) {
- collectSources(folder, added, pm);
- }
- break;
- }
- }
-
- private void collectSources(ICContainer container, Collection sources, IProgressMonitor pm) throws CoreException {
- container.accept(new TranslationUnitCollector(sources, sources, fAllFiles, pm));
- }
-
- public void run(IProgressMonitor monitor) {
- if (fDelegate != null) {
- fDelegate.run(monitor);
- }
- }
-
- public IPDOMIndexer getIndexer() {
- return fIndexer;
- }
-
- public IndexerProgress getProgressInformation() {
- return fDelegate != null ? fDelegate.getProgressInformation() : fProgress;
- }
-
- public boolean isEmpty() {
- return fDelegate == null;
- }
-}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMUpdateTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMUpdateTask.java
index bff111b58ac..3466e3fd9c8 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMUpdateTask.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMUpdateTask.java
@@ -34,13 +34,14 @@ public class PDOMUpdateTask implements IPDOMIndexerTask {
private final IPDOMIndexer fIndexer;
private final IndexerProgress fProgress;
+ private final boolean fCheckTimestamps;
private volatile IPDOMIndexerTask fDelegate;
- private boolean fCheckTimestamps= true;
private ArrayList fFilesAndFolders= null;
- public PDOMUpdateTask(IPDOMIndexer indexer) {
+ public PDOMUpdateTask(IPDOMIndexer indexer, boolean checkTimestamps) {
fIndexer= indexer;
fProgress= createProgress();
+ fCheckTimestamps= checkTimestamps;
}
private IndexerProgress createProgress() {
@@ -98,10 +99,6 @@ public class PDOMUpdateTask implements IPDOMIndexerTask {
return fDelegate != null ? fDelegate.getProgressInformation() : fProgress;
}
- public void setCheckTimestamps(boolean timestamps) {
- fCheckTimestamps= timestamps;
- }
-
public void setTranslationUnitSelection(List filesAndFolders) {
fFilesAndFolders= new ArrayList(filesAndFolders.size());
fFilesAndFolders.addAll(filesAndFolders);
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java
index 19a01e3d60a..36e6d9a2c13 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java
@@ -303,6 +303,8 @@ public class CCorePlugin extends Plugin {
*/
public void stop(BundleContext context) throws Exception {
try {
+ pdomManager.shutdown();
+
PositionTrackerManager.getInstance().uninstall();
// if (fDescriptorManager != null) {
diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml
index 4ad99b9c512..62d0d667d39 100644
--- a/core/org.eclipse.cdt.ui/plugin.xml
+++ b/core/org.eclipse.cdt.ui/plugin.xml
@@ -1180,6 +1180,11 @@
contextId="org.eclipse.cdt.ui.cEditorScope"
commandId="org.eclipse.cdt.ui.navigate.opentype"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+