From 48a0dbe690900c6a3f5ad05b850537cba712cbd3 Mon Sep 17 00:00:00 2001 From: John Cortell Date: Tue, 13 Oct 2009 20:27:07 +0000 Subject: [PATCH] Adjustment to previous fix so that it more likely addresses 291912 --- .../internal/core/model/CDebugTarget.java | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java index 239fa22e5bf..6b7ecc06c73 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java @@ -13,12 +13,10 @@ package org.eclipse.cdt.debug.internal.core.model; import java.io.File; -import com.ibm.icu.text.MessageFormat; import java.util.ArrayList; -import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; import java.util.StringTokenizer; import org.eclipse.cdt.core.CCorePlugin; @@ -89,10 +87,10 @@ import org.eclipse.cdt.debug.core.model.IRegisterDescriptor; import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator; import org.eclipse.cdt.debug.core.sourcelookup.ISourceLookupChangeListener; import org.eclipse.cdt.debug.internal.core.CBreakpointManager; -import org.eclipse.cdt.debug.internal.core.CSettingsManager; import org.eclipse.cdt.debug.internal.core.CGlobalVariableManager; import org.eclipse.cdt.debug.internal.core.CMemoryBlockRetrievalExtension; import org.eclipse.cdt.debug.internal.core.CRegisterManager; +import org.eclipse.cdt.debug.internal.core.CSettingsManager; import org.eclipse.cdt.debug.internal.core.CSignalManager; import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants; import org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupParticipant; @@ -136,6 +134,8 @@ import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer; import org.eclipse.debug.core.sourcelookup.containers.FolderSourceContainer; import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer; +import com.ibm.icu.text.MessageFormat; + /** * Debug target for C/C++ debug model. */ @@ -1813,8 +1813,11 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv } private void setSourceLookupPath( ISourceContainer[] containers ) { - ArrayList list = new ArrayList( containers.length ); - getSourceLookupPath( list, containers, new HashSet(containers.length) ); + // LinkedHashSet allows quick lookup and deterministic ordering. We need + // the former to efficiently prevent infinite recursion + LinkedHashSet list = new LinkedHashSet( containers.length ); + + getSourceLookupPath( list, containers ); try { final ICDITarget cdiTarget = getCDITarget(); if (cdiTarget != null) { @@ -1826,39 +1829,41 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv } } - private void getSourceLookupPath( List list, ISourceContainer[] containers, Set alreadyProcessed ) { + private void getSourceLookupPath( LinkedHashSet list, ISourceContainer[] containers) { for ( ISourceContainer container : containers ) { + String pathToAdd = null; - // Not sure that this addresses the problem behind 291912 but it's - // easy enough to bullet proof the logic to prevent infinite - // recursion when a source-container instance appears twice in the - // hierarchy - if (alreadyProcessed.contains(container)) { - continue; - } - else { - alreadyProcessed.add(container); - } if ( container instanceof ProjectSourceContainer ) { IProject project = ((ProjectSourceContainer)container).getProject(); if ( project != null && project.exists() ) - list.add( project.getLocation().toPortableString() ); + pathToAdd = project.getLocation().toPortableString(); } if ( container instanceof FolderSourceContainer ) { IContainer folderContainer = ((FolderSourceContainer)container).getContainer(); - if ( folderContainer != null && folderContainer.exists() ) - list.add( folderContainer.getLocation().toPortableString() ); + if ( folderContainer != null && folderContainer.exists() ) { + pathToAdd = folderContainer.getLocation().toPortableString(); + } } if ( container instanceof DirectorySourceContainer ) { File dir = ((DirectorySourceContainer)container).getDirectory(); if ( dir != null && dir.exists() ) { IPath path = new Path( dir.getAbsolutePath() ); - list.add( path.toPortableString() ); + pathToAdd = path.toPortableString(); } } + + if ( pathToAdd != null ) { + // 291912. Avoid infinite recursion + if ( list.contains(pathToAdd) ) { + continue; + } + + list.add( pathToAdd ); + } + if ( container.isComposite() ) { try { - getSourceLookupPath( list, container.getSourceContainers(), alreadyProcessed ); + getSourceLookupPath( list, container.getSourceContainers() ); } catch( CoreException e ) { CDebugCorePlugin.log( e.getStatus() );