From da12ba63cf6d383e4c4e7d00b96c3affc87c3597 Mon Sep 17 00:00:00 2001 From: Vladimir Hirsl Date: Wed, 13 Jul 2005 20:00:11 +0000 Subject: [PATCH] Fix for PR 103428: IndexerManager leaks elementchangelisteners on reset() In case of indexer thread restart after crash/shutdown previous listener is deregistered before registering a new one. --- core/org.eclipse.cdt.core/ChangeLog | 7 +++++++ .../core/search/indexing/IndexManager.java | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 31313067342..7b4d8f13942 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,10 @@ +2005-07-13 Vladimir Hirsl + Fix for PR 103428: IndexerManager leaks elementchangelisteners on reset() + In case of indexer thread restart after crash/shutdown previous listener is + deregistered before registering a new one. + + * index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java + 2005-07-11 Vladimir Hirsl Fix for PR 100585: [Scanner Discovery - Indexer] Indexer not notified of scanner info change Change in project/file scanner info will now cause whole project or just affected files diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java index 7f1b2ec60a9..f436208fe78 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java @@ -26,7 +26,9 @@ import org.eclipse.cdt.core.model.ElementChangedEvent; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICModelMarker; +import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IElementChangedListener; +import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.index.IndexRequest; import org.eclipse.cdt.internal.core.index.cindexstorage.CIndexStorage; @@ -97,6 +99,8 @@ public class IndexManager extends JobManager{ private HashMap indexerMap = null; private ReadWriteMonitor monitor = new ReadWriteMonitor(); + + private static ElementChangeListener elementChangeListener = null; /** * Flush current state @@ -110,7 +114,11 @@ public class IndexManager extends JobManager{ this.indexerMap = new HashMap(5); // subscribe for path entry changes - CoreModel.getDefault().addElementChangedListener(new ElementChangeListener()); + if (elementChangeListener != null) { + CoreModel.getDefault().removeElementChangedListener(elementChangeListener); + } + elementChangeListener = new ElementChangeListener(); + CoreModel.getDefault().addElementChangedListener(elementChangeListener); } finally{ monitor.exitWrite(); } @@ -152,12 +160,12 @@ public class IndexManager extends JobManager{ ICElement element= delta.getElement(); IResource res = element.getResource(); - if (res instanceof IProject) { + if (element instanceof ICProject && res instanceof IProject) { currentProject = (IProject) res; } if (isPathEntryChange(delta)) { scannerInfoChanged = true; - if (res instanceof IFile) { + if (element instanceof ITranslationUnit && res instanceof IFile) { if (!changedElements.contains(res)) { changedElements.add(res); } @@ -328,6 +336,10 @@ public class IndexManager extends JobManager{ } } + if (elementChangeListener != null) { + CoreModel.getDefault().removeElementChangedListener(elementChangeListener); + elementChangeListener = null; + } super.shutdown(); }