diff options
author | Doug Schaefer | 2006-05-28 04:16:42 +0000 |
---|---|---|
committer | Doug Schaefer | 2006-05-28 04:16:42 +0000 |
commit | 933ecf7e00de8ec13c539ce5b335a2705cf05839 (patch) | |
tree | 9fa1e614b18c362e876c0cbe01e95c6238723406 | |
parent | 090476da2dec6e339aa45e73008cbb87da2b34d4 (diff) | |
download | org.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.
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 |