diff options
author | Mikhail Khodjaiants | 2010-04-17 21:42:13 +0000 |
---|---|---|
committer | Mikhail Khodjaiants | 2010-04-17 21:42:13 +0000 |
commit | a67b587f77365faa6a70552adfcc0b2a793e4d61 (patch) | |
tree | 67fe94cafc37d701bb159445f8b23cde555d5874 /debug/org.eclipse.cdt.debug.core | |
parent | f2876e9a5c40b62a5798a4458685ec4a04da58a8 (diff) | |
download | org.eclipse.cdt-a67b587f77365faa6a70552adfcc0b2a793e4d61.tar.gz org.eclipse.cdt-a67b587f77365faa6a70552adfcc0b2a793e4d61.tar.xz org.eclipse.cdt-a67b587f77365faa6a70552adfcc0b2a793e4d61.zip |
Bug 309212: No registers with HEAD. Workaround for gdb 7.0.
Diffstat (limited to 'debug/org.eclipse.cdt.debug.core')
2 files changed, 42 insertions, 21 deletions
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java index 3a92a9b4be6..cf0c37492c9 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java @@ -15,6 +15,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.concurrent.locks.ReentrantLock; import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; @@ -68,6 +69,10 @@ public class CRegisterManager { private boolean fUseDefaultRegisterGroups = true; private CStackFrame fCurrentFrame; + + private ReentrantLock fInitializationLock = new ReentrantLock(); + + private boolean fInitialized = false; /** * Constructor for CRegisterManager. @@ -123,27 +128,40 @@ public class CRegisterManager { } public void initialize() { - ICDIRegisterGroup[] groups = new ICDIRegisterGroup[0]; - try { - groups = getDebugTarget().getCDITarget().getRegisterGroups(); - } - catch( CDIException e ) { - CDebugCorePlugin.log( e ); - } - List list = new ArrayList(); - for( int i = 0; i < groups.length; ++i ) { - try { - ICDIRegisterDescriptor[] cdiDescriptors = groups[i].getRegisterDescriptors(); - for ( int j = 0; j < cdiDescriptors.length; ++j ) { - list.add( new CRegisterDescriptor( groups[i], cdiDescriptors[j] ) ); - } - } - catch( CDIException e ) { - CDebugCorePlugin.log( e ); - } - } - fRegisterDescriptors = (IRegisterDescriptor[])list.toArray( new IRegisterDescriptor[list.size()] ); - createRegisterGroups(); + if ( !fInitialized ) { + synchronized( fInitializationLock ) { + if ( !fInitialized ) { + boolean failed = false; + ICDIRegisterGroup[] groups = new ICDIRegisterGroup[0]; + try { + groups = getDebugTarget().getCDITarget().getRegisterGroups(); + } + catch( CDIException e ) { + CDebugCorePlugin.log( e ); + failed = true; + } + List<CRegisterDescriptor> list = new ArrayList<CRegisterDescriptor>(); + for( int i = 0; i < groups.length; ++i ) { + try { + ICDIRegisterDescriptor[] cdiDescriptors = groups[i].getRegisterDescriptors(); + for ( int j = 0; j < cdiDescriptors.length; ++j ) { + list.add( new CRegisterDescriptor( groups[i], cdiDescriptors[j] ) ); + } + } + catch( CDIException e ) { + CDebugCorePlugin.log( e ); + failed = true; + } + } + fRegisterDescriptors = list.toArray( new IRegisterDescriptor[list.size()] ); + fInitialized = !failed; + if ( failed ) + fRegisterGroups = Collections.emptyList(); + else + createRegisterGroups(); + } + } + } } public void addRegisterGroup( final String name, final IRegisterDescriptor[] descriptors ) { 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 2396e6974a8..2f74158a750 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 @@ -1563,6 +1563,9 @@ public class CDebugTarget extends CDebugElement implements ICDebugTarget, ICDIEv } public CRegisterManager getRegisterManager() { + // Workaround for bug #309212. gdb 7.0 returns "No registers" error + // at the beginning of the session. + fRegisterManager.initialize(); return fRegisterManager; } |