1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 01:36:01 +02:00

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.
This commit is contained in:
Vladimir Hirsl 2005-07-13 20:00:11 +00:00
parent 0caa2a5bd5
commit da12ba63cf
2 changed files with 22 additions and 3 deletions

View file

@ -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 2005-07-11 Vladimir Hirsl
Fix for PR 100585: [Scanner Discovery - Indexer] Indexer not notified of scanner info change 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 Change in project/file scanner info will now cause whole project or just affected files

View file

@ -26,7 +26,9 @@ import org.eclipse.cdt.core.model.ElementChangedEvent;
import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.ICModelMarker; 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.IElementChangedListener;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.index.IndexRequest; import org.eclipse.cdt.internal.core.index.IndexRequest;
import org.eclipse.cdt.internal.core.index.cindexstorage.CIndexStorage; import org.eclipse.cdt.internal.core.index.cindexstorage.CIndexStorage;
@ -98,6 +100,8 @@ public class IndexManager extends JobManager{
private ReadWriteMonitor monitor = new ReadWriteMonitor(); private ReadWriteMonitor monitor = new ReadWriteMonitor();
private static ElementChangeListener elementChangeListener = null;
/** /**
* Flush current state * Flush current state
*/ */
@ -110,7 +114,11 @@ public class IndexManager extends JobManager{
this.indexerMap = new HashMap(5); this.indexerMap = new HashMap(5);
// subscribe for path entry changes // 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{ } finally{
monitor.exitWrite(); monitor.exitWrite();
} }
@ -152,12 +160,12 @@ public class IndexManager extends JobManager{
ICElement element= delta.getElement(); ICElement element= delta.getElement();
IResource res = element.getResource(); IResource res = element.getResource();
if (res instanceof IProject) { if (element instanceof ICProject && res instanceof IProject) {
currentProject = (IProject) res; currentProject = (IProject) res;
} }
if (isPathEntryChange(delta)) { if (isPathEntryChange(delta)) {
scannerInfoChanged = true; scannerInfoChanged = true;
if (res instanceof IFile) { if (element instanceof ITranslationUnit && res instanceof IFile) {
if (!changedElements.contains(res)) { if (!changedElements.contains(res)) {
changedElements.add(res); changedElements.add(res);
} }
@ -328,6 +336,10 @@ public class IndexManager extends JobManager{
} }
} }
if (elementChangeListener != null) {
CoreModel.getDefault().removeElementChangedListener(elementChangeListener);
elementChangeListener = null;
}
super.shutdown(); super.shutdown();
} }