Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Khodjaiants2010-04-17 21:42:13 +0000
committerMikhail Khodjaiants2010-04-17 21:42:13 +0000
commita67b587f77365faa6a70552adfcc0b2a793e4d61 (patch)
tree67fe94cafc37d701bb159445f8b23cde555d5874 /debug/org.eclipse.cdt.debug.core
parentf2876e9a5c40b62a5798a4458685ec4a04da58a8 (diff)
downloadorg.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')
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/CRegisterManager.java60
-rw-r--r--debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java3
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;
}

Back to the top