From a67b587f77365faa6a70552adfcc0b2a793e4d61 Mon Sep 17 00:00:00 2001 From: Mikhail Khodjaiants Date: Sat, 17 Apr 2010 21:42:13 +0000 Subject: [PATCH] Bug 309212: No registers with HEAD. Workaround for gdb 7.0. --- .../debug/internal/core/CRegisterManager.java | 60 ++++++++++++------- .../internal/core/model/CDebugTarget.java | 3 + 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 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 ); + 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; }