Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Schaefer2006-05-28 04:16:42 +0000
committerDoug Schaefer2006-05-28 04:16:42 +0000
commit933ecf7e00de8ec13c539ce5b335a2705cf05839 (patch)
tree9fa1e614b18c362e876c0cbe01e95c6238723406
parent090476da2dec6e339aa45e73008cbb87da2b34d4 (diff)
downloadorg.eclipse.cdt-933ecf7e00de8ec13c539ce5b335a2705cf05839.tar.gz
org.eclipse.cdt-933ecf7e00de8ec13c539ce5b335a2705cf05839.tar.xz
org.eclipse.cdt-933ecf7e00de8ec13c539ce5b335a2705cf05839.zip
Bug 135034 - Handle project deletion while indexing. Cancels all pending and the current task if they are started by the indexer associated with the project.
Also snuck in a change to the menu items for Searching decls and refs, i.e. removed to "All" to match the JDT.
-rw-r--r--core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java3
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMIndexerTask.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMManager.java3
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMIndexerJob.java55
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java10
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java5
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java5
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties4
8 files changed, 77 insertions, 10 deletions
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
index 4e168735106..30f09b47c0a 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
@@ -48,6 +48,7 @@ import org.eclipse.cdt.core.model.IParent;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
+import org.eclipse.cdt.internal.core.pdom.PDOMManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
@@ -1136,6 +1137,8 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
public void deleting(IProject project) {
// stop the binary runner for this project
removeBinaryRunner(project);
+ // stop indexing jobs for this project
+ CCorePlugin.getPDOMManager().deleting(create(project));
}
} \ No newline at end of file
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMIndexerTask.java
index e0faa680887..12ff497d802 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMIndexerTask.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMIndexerTask.java
@@ -19,4 +19,6 @@ public interface IPDOMIndexerTask {
*/
public void run(IProgressMonitor monitor);
+ public IPDOMIndexer getIndexer();
+
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMManager.java
index 7823d08cef7..d04d30ddd54 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMManager.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMManager.java
@@ -36,4 +36,7 @@ public interface IPDOMManager {
// Enqueue and indexer sub job
public void enqueue(IPDOMIndexerTask subjob);
+ // Project being deleted
+ public void deleting(ICProject project);
+
}
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 314acfe34c6..f58e16484b5 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
@@ -3,9 +3,11 @@
*/
package org.eclipse.cdt.internal.core.pdom;
+import java.util.Iterator;
import java.util.LinkedList;
import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.IPDOMIndexer;
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
@@ -22,7 +24,12 @@ public class PDOMIndexerJob extends Job {
private final PDOMManager manager;
private LinkedList queue = new LinkedList();
+ private IPDOMIndexerTask currentTask;
+ private boolean isCancelling = false;
+ private Object taskMutex = new Object();
+ private IProgressMonitor monitor;
+
public PDOMIndexerJob(PDOMManager manager) {
super(CCorePlugin.getResourceString("pdom.indexer.name")); //$NON-NLS-1$
this.manager = manager;
@@ -30,6 +37,8 @@ public class PDOMIndexerJob extends Job {
}
protected IStatus run(IProgressMonitor monitor) {
+ this.monitor = monitor;
+
long start = System.currentTimeMillis();
String taskName = CCorePlugin.getResourceString("pdom.indexer.task"); //$NON-NLS-1$
@@ -38,10 +47,20 @@ public class PDOMIndexerJob extends Job {
fillQueue();
while (true) {
while (!queue.isEmpty()) {
- if (monitor.isCanceled())
- return Status.CANCEL_STATUS;
- IPDOMIndexerTask task = (IPDOMIndexerTask)queue.removeFirst();
- task.run(monitor);
+ synchronized (taskMutex) {
+ currentTask = (IPDOMIndexerTask)queue.removeFirst();
+ }
+ currentTask.run(monitor);
+ synchronized (taskMutex) {
+ if (isCancelling) {
+ // TODO chance for confusion here is user cancels
+ // while project is getting deletes.
+ monitor.setCanceled(false);
+ isCancelling = false;
+ taskMutex.notify();
+ } else if (monitor.isCanceled())
+ return Status.CANCEL_STATUS;
+ }
}
if (manager.finishIndexerJob())
break;
@@ -58,10 +77,30 @@ public class PDOMIndexerJob extends Job {
}
private void fillQueue() {
- IPDOMIndexerTask task = manager.getNextTask();
- while (task != null) {
- queue.addLast(task);
- task = manager.getNextTask();
+ synchronized (taskMutex) {
+ IPDOMIndexerTask task = manager.getNextTask();
+ while (task != null) {
+ queue.addLast(task);
+ task = manager.getNextTask();
+ }
+ }
+ }
+
+ public void cancelJobs(IPDOMIndexer indexer) {
+ synchronized (taskMutex) {
+ for (Iterator i = queue.iterator(); i.hasNext();) {
+ IPDOMIndexerTask task = (IPDOMIndexerTask)i.next();
+ if (task.getIndexer().equals(indexer))
+ i.remove();
+ }
+ if (currentTask != null && currentTask.getIndexer().equals(indexer)) {
+ monitor.setCanceled(true);
+ isCancelling = true;
+ try {
+ taskMutex.wait();
+ } catch (InterruptedException e) {
+ }
+ }
}
}
}
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 d31bd5aa44d..2f0259dcd54 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
@@ -304,6 +304,16 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
}
}
+ public void deleting(ICProject project) {
+ // Project is about to be deleted. Stop all indexing tasks for it
+ IPDOMIndexer indexer = getIndexer(project);
+ synchronized (indexerJobMutex) {
+ if (indexerJob != null) {
+ indexerJob.cancelJobs(indexer);
+ }
+ }
+ }
+
/**
* Startup the PDOM. This mainly sets us up to handle model
* change events.
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java
index 10b9c822b62..5b792818189 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java
@@ -12,6 +12,7 @@
package org.eclipse.cdt.internal.core.pdom.indexer.fast;
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.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
@@ -47,6 +48,10 @@ public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
this.codeReaderFactory = new PDOMCodeReaderFactory(pdom);
}
+ public IPDOMIndexer getIndexer() {
+ return indexer;
+ }
+
protected void addTU(ITranslationUnit tu) throws InterruptedException, CoreException {
ILanguage language = tu.getLanguage();
if (language == null)
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java
index 22cc8c189db..a8463a0f26e 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java
@@ -12,6 +12,7 @@
package org.eclipse.cdt.internal.core.pdom.indexer.full;
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.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
@@ -44,6 +45,10 @@ public abstract class PDOMFullIndexerJob implements IPDOMIndexerTask {
this.pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(indexer.getProject());
}
+ public IPDOMIndexer getIndexer() {
+ return indexer;
+ }
+
protected IASTTranslationUnit parse(ITranslationUnit tu) throws CoreException {
ILanguage language = tu.getLanguage();
if (language == null)
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties
index 7982e3b45a8..51ae1690d7d 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMessages.properties
@@ -10,8 +10,8 @@
###############################################################################
group.search=S&earch For
-group.declarations= All Dec&larations
-group.references= All Re&ferences
+group.declarations=Dec&larations
+group.references=Re&ferences
Search.Error.search.title=Search Error

Back to the top