Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/ExpressionManager.java10
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/RegisterManager.java17
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java17
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java45
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java186
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Thread.java248
-rw-r--r--debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/VariableDescriptor.java20
7 files changed, 235 insertions, 308 deletions
diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/ExpressionManager.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/ExpressionManager.java
index c6f28fd1d62..7d59720018e 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/ExpressionManager.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/ExpressionManager.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2006 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
+ * Alena Laskavaia (QNX) - Bug 221224
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi;
@@ -184,7 +185,7 @@ public class ExpressionManager extends Manager {
Target target = (Target)frame.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(frame.getThread(), false);
((Thread)frame.getThread()).setCurrentStackFrame(frame, false);
@@ -203,12 +204,9 @@ public class ExpressionManager extends Manager {
} catch (MIException e) {
throw new MI2CDIException(e);
} finally {
- try {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/RegisterManager.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/RegisterManager.java
index 70eba6c9c20..a8d0698eb5d 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/RegisterManager.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/RegisterManager.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2007 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Giuseppe Montalto, STMicroelectronics - bug 174988
+ * Alena Laskavaia (QNX) - Bug 221224
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi;
@@ -255,7 +256,7 @@ public class RegisterManager extends Manager {
Target target = (Target)frame.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(frame.getThread(), false);
((Thread)frame.getThread()).setCurrentStackFrame(frame, false);
@@ -271,12 +272,9 @@ public class RegisterManager extends Manager {
} catch (MIException e) {
throw new MI2CDIException(e);
} finally {
- try {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
}
@@ -284,7 +282,7 @@ public class RegisterManager extends Manager {
Target target = (Target)frame.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(frame.getThread(), false);
((Thread)frame.getThread()).setCurrentStackFrame(frame, false);
@@ -301,12 +299,9 @@ public class RegisterManager extends Manager {
} catch (MIException e) {
throw new MI2CDIException(e);
} finally {
- try {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java
index d57a9eb276f..4442a472209 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2006 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
+ * Alena Laskavaia (QNX) - Bug 221224
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi;
@@ -424,18 +425,15 @@ public class SourceManager extends Manager {
Target target = (Target)frame.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(frame.getThread(), false);
((Thread)frame.getThread()).setCurrentStackFrame(frame, false);
return getDetailTypeName(target, variable);
} finally {
- try {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
}
public String getDetailTypeName(Target target, String typename) throws CDIException {
@@ -465,18 +463,15 @@ public class SourceManager extends Manager {
Target target = (Target)frame.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(frame.getThread(), false);
((Thread)frame.getThread()).setCurrentStackFrame(frame, false);
return getTypeName(target, variable);
} finally {
- try {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java
index 4dab7057ef2..7ea3c654090 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/VariableManager.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2007 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,7 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
- * Alena Laskavaia (QNX) - Bug 197986
+ * Alena Laskavaia (QNX) - Bug 197986, Bug 221224
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi;
@@ -177,7 +177,7 @@ public class VariableManager extends Manager {
Target target = (Target)frame.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(frame.getThread(), false);
((Thread)frame.getThread()).setCurrentStackFrame(frame, false);
@@ -194,15 +194,12 @@ public class VariableManager extends Manager {
} catch (MIException e) {
throw new MI2CDIException(e);
} finally {
- try {
MISession miSession = target.getMISession();
RxThread rxThread = miSession.getRxThread();
rxThread.setEnableConsole(true);
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
} else {
throw new CDIException(CdiResources.getString("cdi.VariableManager.Unknown_type")); //$NON-NLS-1$
@@ -374,7 +371,7 @@ public class VariableManager extends Manager {
Target target = (Target)argDesc.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(stack.getThread(), false);
((Thread)stack.getThread()).setCurrentStackFrame(stack, false);
@@ -394,12 +391,9 @@ public class VariableManager extends Manager {
} catch (MIException e) {
throw new MI2CDIException(e);
} finally {
- try {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
}
return argument;
@@ -410,7 +404,7 @@ public class VariableManager extends Manager {
Target target = (Target)frame.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(frame.getThread(), false);
((Thread)frame.getThread()).setCurrentStackFrame(frame, false);
@@ -440,12 +434,9 @@ public class VariableManager extends Manager {
} catch (MIException e) {
throw new MI2CDIException(e);
} finally {
- try {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
return (ICDIArgumentDescriptor[]) argObjects.toArray(new ICDIArgumentDescriptor[0]);
}
@@ -506,7 +497,7 @@ public class VariableManager extends Manager {
Target target = (Target)frame.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(frame.getThread(), false);
((Thread)frame.getThread()).setCurrentStackFrame(frame, false);
@@ -529,13 +520,10 @@ public class VariableManager extends Manager {
}
} catch (MIException e) {
throw new MI2CDIException(e);
- } finally {
- try {
+ } finally {
target.setCurrentThread(currentThread, false);
currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
return (ICDILocalVariableDescriptor[]) varObjects.toArray(new ICDILocalVariableDescriptor[0]);
}
@@ -552,7 +540,7 @@ public class VariableManager extends Manager {
Target target = (Target)varDesc.getTarget();
Thread currentThread = (Thread)target.getCurrentThread();
StackFrame currentFrame = currentThread.getCurrentStackFrame();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
target.setCurrentThread(stack.getThread(), false);
((Thread)stack.getThread()).setCurrentStackFrame(stack, false);
@@ -572,12 +560,9 @@ public class VariableManager extends Manager {
} catch (MIException e) {
throw new MI2CDIException(e);
} finally {
- try {
- target.setCurrentThread(currentThread, false);
- currentThread.setCurrentStackFrame(currentFrame, false);
- } finally {
- target.releaseTarget();
- }
+ target.setCurrentThread(currentThread, false);
+ currentThread.setCurrentStackFrame(currentFrame, false);
+ }
}
}
return local;
diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java
index 3e16afc7987..b9d2debd4bb 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Target.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2007 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Ken Ryall (Nokia) - 175532 support the address to source location API
+ * Alena Laskavaia (QNX) - Bug 221224
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi.model;
@@ -100,45 +101,6 @@ import org.eclipse.cdt.debug.mi.core.output.MIThreadSelectInfo;
*/
public class Target extends SessionObject implements ICDITarget, ICDIBreakpointManagement2, ICDIAddressToSource, ICDIMemorySpaceManagement {
- public class Lock {
-
- java.lang.Thread heldBy;
- int count;
-
- public Lock() {
-
- }
-
- public synchronized void aquire() {
- if (heldBy == null || heldBy == java.lang.Thread.currentThread()) {
- heldBy = java.lang.Thread.currentThread();
- count++;
- } else {
- while (true) {
- try {
- wait();
- } catch (InterruptedException e) {
- }
- if (heldBy == null) {
- heldBy = java.lang.Thread.currentThread();
- count++;
- return;
- }
- }
- }
- }
-
- public synchronized void release() {
- if (heldBy == null || heldBy != java.lang.Thread.currentThread()) {
- throw new IllegalStateException("Thread does not own lock");
- }
- if(--count == 0) {
- heldBy = null;
- notifyAll();
- }
- }
- }
-
MISession miSession;
ICDITargetConfiguration fConfiguration;
Thread[] noThreads = new Thread[0];
@@ -147,7 +109,7 @@ public class Target extends SessionObject implements ICDITarget, ICDIBreakpointM
String fEndian = null;
boolean suspended = true;
boolean deferBreakpoints = true;
- Lock lock = new Lock();
+ final private Object lock = new Object();
final static String CODE_MEMORY_SPACE = "code"; //$NON-NLS-1$
final static String DATA_MEMORY_SPACE = "data"; //$NON-NLS-1$
@@ -158,13 +120,37 @@ public class Target extends SessionObject implements ICDITarget, ICDIBreakpointM
currentThreads = noThreads;
}
- public void lockTarget() {
- lock.aquire();
- }
-
- public void releaseTarget() {
- lock.release();
+ /**
+ * Return lock object for target. Replacement for <code>lockTarget</code> and
+ * <code>releaseTarget</code> methods.
+ * <p>
+ * Use as synchronization object:
+ * </p>
+ * new code:
+ *
+ * <pre>
+ * synchronized (target.getLock()) {
+ * ...
+ * }
+ * </pre>
+ *
+ * old code:
+ *
+ * <pre>
+ * target.lockTarget();
+ * try {
+ * ...
+ * } finally {
+ * target.releaseTarget();
+ * }
+ * </pre>
+ *
+ * @since 5.0
+ */
+ public Object getLock() {
+ return lock;
}
+
public MISession getMISession() {
return miSession;
@@ -271,15 +257,14 @@ public class Target extends SessionObject implements ICDITarget, ICDIBreakpointM
// If we use "info threads" in getCThreads() this
// will be overwritten. However if we use -stack-list-threads
// it does not provide to the current thread
- lockTarget();
- try {
- // get the new Threads.
- currentThreadId = newThreadId;
- currentThreads = getCThreads();
- } catch (CDIException e) {
- currentThreads = noThreads;
- } finally {
- releaseTarget();
+ synchronized (lock) {
+ try {
+ // get the new Threads.
+ currentThreadId = newThreadId;
+ currentThreads = getCThreads();
+ } catch (CDIException e) {
+ currentThreads = noThreads;
+ }
}
// Fire CreatedEvent for new threads.
@@ -338,57 +323,56 @@ public class Target extends SessionObject implements ICDITarget, ICDIBreakpointM
*/
public Thread[] getCThreads() throws CDIException {
Thread[] cthreads = noThreads;
- try {
- lockTarget();
+ synchronized (lock) {
RxThread rxThread = miSession.getRxThread();
rxThread.setEnableConsole(false);
- CommandFactory factory = miSession.getCommandFactory();
- CLIInfoThreads tids = factory.createCLIInfoThreads();
- // HACK/FIXME: gdb/mi thread-list-ids does not
- // show any newly create thread, we workaround by
- // issuing "info threads" instead.
- // MIThreadListIds tids = factory.createMIThreadListIds();
- // MIThreadListIdsInfo info = tids.getMIThreadListIdsInfo();
- miSession.postCommand(tids);
- CLIInfoThreadsInfo info = tids.getMIInfoThreadsInfo();
- int[] ids;
- String[] names;
- if (info == null) {
- ids = new int[0];
- names = new String[0];
- } else {
- ids = info.getThreadIds();
- names = info.getThreadNames();
- currentThreadId = info.getCurrentThread();
- }
- if (ids != null && ids.length > 0) {
- cthreads = new Thread[ids.length];
- // Ok that means it is a multiThreaded.
- if (names != null && names.length == ids.length) {
- for (int i = 0; i < ids.length; i++) {
- cthreads[i] = new Thread(this, ids[i], names[i]);
- }
+ try {
+ CommandFactory factory = miSession.getCommandFactory();
+ CLIInfoThreads tids = factory.createCLIInfoThreads();
+ // HACK/FIXME: gdb/mi thread-list-ids does not
+ // show any newly create thread, we workaround by
+ // issuing "info threads" instead.
+ // MIThreadListIds tids = factory.createMIThreadListIds();
+ // MIThreadListIdsInfo info = tids.getMIThreadListIdsInfo();
+ miSession.postCommand(tids);
+ CLIInfoThreadsInfo info = tids.getMIInfoThreadsInfo();
+ int[] ids;
+ String[] names;
+ if (info == null) {
+ ids = new int[0];
+ names = new String[0];
} else {
- for (int i = 0; i < ids.length; i++) {
- cthreads[i] = new Thread(this, ids[i]);
+ ids = info.getThreadIds();
+ names = info.getThreadNames();
+ currentThreadId = info.getCurrentThread();
+ }
+ if (ids != null && ids.length > 0) {
+ cthreads = new Thread[ids.length];
+ // Ok that means it is a multiThreaded.
+ if (names != null && names.length == ids.length) {
+ for (int i = 0; i < ids.length; i++) {
+ cthreads[i] = new Thread(this, ids[i], names[i]);
+ }
+ } else {
+ for (int i = 0; i < ids.length; i++) {
+ cthreads[i] = new Thread(this, ids[i]);
+ }
}
+ } else {
+ // Provide a dummy.
+ cthreads = new Thread[]{new Thread(this, 0)};
}
- } else {
- // Provide a dummy.
- cthreads = new Thread[]{new Thread(this, 0)};
- }
- // FIX: When attaching there is no thread selected
- // We will choose the first one as a workaround.
- if (currentThreadId == 0 && cthreads.length > 0) {
- setCurrentThread(cthreads[0], false);
+ // FIX: When attaching there is no thread selected
+ // We will choose the first one as a workaround.
+ if (currentThreadId == 0 && cthreads.length > 0) {
+ setCurrentThread(cthreads[0], false);
+ }
+ } catch (MIException e) {
+ // Do not throw anything in this case.
+ throw new CDIException(e.getMessage());
+ } finally {
+ rxThread.setEnableConsole(true);
}
- } catch (MIException e) {
- // Do not throw anything in this case.
- throw new CDIException(e.getMessage());
- } finally {
- RxThread rxThread = miSession.getRxThread();
- rxThread.setEnableConsole(true);
- releaseTarget();
}
return cthreads;
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Thread.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Thread.java
index d031b9c5ec9..ca92915cd51 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Thread.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/Thread.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2007 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
+ * Alena Laskavaia (QNX) - Bug 221224
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi.model;
@@ -109,32 +110,29 @@ public class Thread extends CObject implements ICDIThread {
currentFrames = new ArrayList();
Target target = (Target)getTarget();
ICDIThread currentThread = target.getCurrentThread();
- target.lockTarget();
- try {
- target.setCurrentThread(this, false);
- MISession mi = target.getMISession();
- CommandFactory factory = mi.getCommandFactory();
- MIStackListFrames frames = factory.createMIStackListFrames();
- mi.postCommand(frames);
- MIStackListFramesInfo info = frames.getMIStackListFramesInfo();
- if (info == null) {
- throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
- }
- MIFrame[] miFrames = info.getMIFrames();
- for (int i = 0; i < miFrames.length; i++) {
- currentFrames.add(new StackFrame(this, miFrames[i], depth - miFrames[i].getLevel()));
- }
- } catch (MIException e) {
- //throw new CDIException(e.getMessage());
- //System.out.println(e);
- } catch (CDIException e) {
- //throw e;
- //System.out.println(e);
- } finally {
+ synchronized (target.getLock()) {
try {
- target.setCurrentThread(currentThread, false);
+ target.setCurrentThread(this, false);
+ MISession mi = target.getMISession();
+ CommandFactory factory = mi.getCommandFactory();
+ MIStackListFrames frames = factory.createMIStackListFrames();
+ mi.postCommand(frames);
+ MIStackListFramesInfo info = frames.getMIStackListFramesInfo();
+ if (info == null) {
+ throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
+ }
+ MIFrame[] miFrames = info.getMIFrames();
+ for (int i = 0; i < miFrames.length; i++) {
+ currentFrames.add(new StackFrame(this, miFrames[i], depth - miFrames[i].getLevel()));
+ }
+ } catch (MIException e) {
+ //throw new CDIException(e.getMessage());
+ //System.out.println(e);
+ } catch (CDIException e) {
+ //throw e;
+ //System.out.println(e);
} finally {
- target.releaseTarget();
+ target.setCurrentThread(currentThread, false);
}
}
// assign the currentFrame if it was not done yet.
@@ -157,45 +155,39 @@ public class Thread extends CObject implements ICDIThread {
if (stackdepth == 0) {
Target target = (Target)getTarget();
ICDIThread currentThread = target.getCurrentThread();
- target.lockTarget();
- try {
- target.setCurrentThread(this, false);
- MISession mi = target.getMISession();
- CommandFactory factory = mi.getCommandFactory();
- MIStackInfoDepth depth = factory.createMIStackInfoDepth();
- mi.postCommand(depth);
- MIStackInfoDepthInfo info = null;
+ synchronized (target.getLock()) {
try {
- // Catch the first exception gdb can recover the second time.
- info = depth.getMIStackInfoDepthInfo();
- if (info == null) {
- throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
- }
- stackdepth = info.getDepth();
- } catch (MIException e) {
- // First try fails, retry. gdb patches up the corrupt frame
- // so retry should give us a frame count that is safe.
- depth = factory.createMIStackInfoDepth();
+ target.setCurrentThread(this, false);
+ MISession mi = target.getMISession();
+ CommandFactory factory = mi.getCommandFactory();
+ MIStackInfoDepth depth = factory.createMIStackInfoDepth();
mi.postCommand(depth);
- info = depth.getMIStackInfoDepthInfo();
- if (info == null) {
- throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
- }
- stackdepth = info.getDepth();
- if (stackdepth > 0) {
- stackdepth--;
+ MIStackInfoDepthInfo info = null;
+ try {
+ // Catch the first exception gdb can recover the second time.
+ info = depth.getMIStackInfoDepthInfo();
+ if (info == null) {
+ throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
+ }
+ stackdepth = info.getDepth();
+ } catch (MIException e) {
+ // First try fails, retry. gdb patches up the corrupt frame
+ // so retry should give us a frame count that is safe.
+ depth = factory.createMIStackInfoDepth();
+ mi.postCommand(depth);
+ info = depth.getMIStackInfoDepthInfo();
+ if (info == null) {
+ throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
+ }
+ stackdepth = info.getDepth();
+ if (stackdepth > 0) {
+ stackdepth--;
+ }
}
- }
- } catch (MIException e) {
- throw new MI2CDIException(e);
- } finally {
- try {
- target.setCurrentThread(currentThread, false);
- } catch (MI2CDIException e) {
- target.releaseTarget();
- throw e;
+ } catch (MIException e) {
+ throw new MI2CDIException(e);
} finally {
- target.releaseTarget();
+ target.setCurrentThread(currentThread, false);
}
}
}
@@ -210,7 +202,7 @@ public class Thread extends CObject implements ICDIThread {
currentFrames = new ArrayList();
Target target = (Target) getTarget();
ICDIThread currentThread = target.getCurrentThread();
- target.lockTarget();
+ synchronized (target.getLock()) {
try {
target.setCurrentThread(this, false);
int depth = getStackFrameCount();
@@ -243,11 +235,8 @@ public class Thread extends CObject implements ICDIThread {
//throw e;
//System.out.println(e);
} finally {
- try {
target.setCurrentThread(currentThread, false);
- } finally {
- target.releaseTarget();
- }
+ }
}
// take time to assign the currentFrame, if it is in the set
if (currentFrame == null) {
@@ -294,34 +283,33 @@ public class Thread extends CObject implements ICDIThread {
int miLevel = getStackFrameCount() - frameLevel;
MIStackSelectFrame frame = factory.createMIStackSelectFrame(miLevel);
// Set ourself as the current thread first.
- target.lockTarget();
- try {
- target.setCurrentThread(this, doUpdate);
- mi.postCommand(frame);
- MIInfo info = frame.getMIInfo();
- if (info == null) {
- throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
- }
- currentFrame = stackframe;
- // Resetting stackframe may change the value of
- // some variables like registers. Call an update()
- // To generate changeEvents.
- if (doUpdate) {
- Session session = (Session) target.getSession();
- RegisterManager regMgr = session.getRegisterManager();
- if (regMgr.isAutoUpdate()) {
- regMgr.update(target);
+ synchronized (target.getLock()) {
+ try {
+ target.setCurrentThread(this, doUpdate);
+ mi.postCommand(frame);
+ MIInfo info = frame.getMIInfo();
+ if (info == null) {
+ throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
}
- VariableManager varMgr = session.getVariableManager();
- if (varMgr.isAutoUpdate()) {
- varMgr.update(target);
+ currentFrame = stackframe;
+ // Resetting stackframe may change the value of
+ // some variables like registers. Call an update()
+ // To generate changeEvents.
+ if (doUpdate) {
+ Session session = (Session) target.getSession();
+ RegisterManager regMgr = session.getRegisterManager();
+ if (regMgr.isAutoUpdate()) {
+ regMgr.update(target);
+ }
+ VariableManager varMgr = session.getVariableManager();
+ if (varMgr.isAutoUpdate()) {
+ varMgr.update(target);
+ }
}
+ } catch (MIException e) {
+ throw new MI2CDIException(e);
}
- } catch (MIException e) {
- throw new MI2CDIException(e);
- } finally {
- target.releaseTarget();
- }
+ }
}
/**
@@ -335,12 +323,10 @@ public class Thread extends CObject implements ICDIThread {
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepInto(int)
*/
public void stepInto(int count) throws CDIException {
- ((Target)getTarget()).lockTarget();
- try {
- ((Target)getTarget()).setCurrentThread(this);
- getTarget().stepInto(count);
- } finally {
- ((Target)getTarget()).releaseTarget();
+ Target target = (Target)getTarget();
+ synchronized(target.getLock()) {
+ target.setCurrentThread(this);
+ target.stepInto(count);
}
}
@@ -355,12 +341,10 @@ public class Thread extends CObject implements ICDIThread {
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepIntoInstruction(int)
*/
public void stepIntoInstruction(int count) throws CDIException {
- ((Target)getTarget()).lockTarget();
- try {
- ((Target)getTarget()).setCurrentThread(this);
- getTarget().stepIntoInstruction(count);
- } finally {
- ((Target)getTarget()).releaseTarget();
+ Target target = (Target)getTarget();
+ synchronized(target.getLock()) {
+ target.setCurrentThread(this);
+ target.stepIntoInstruction(count);
}
}
@@ -375,12 +359,10 @@ public class Thread extends CObject implements ICDIThread {
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepOver(int)
*/
public void stepOver(int count) throws CDIException {
- ((Target)getTarget()).lockTarget();
- try {
- ((Target)getTarget()).setCurrentThread(this);
- getTarget().stepOver(count);
- } finally {
- ((Target)getTarget()).releaseTarget();
+ Target target = (Target)getTarget();
+ synchronized(target.getLock()) {
+ target.setCurrentThread(this);
+ target.stepOver(count);
}
}
@@ -395,12 +377,10 @@ public class Thread extends CObject implements ICDIThread {
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepOverInstruction(int)
*/
public void stepOverInstruction(int count) throws CDIException {
- ((Target)getTarget()).lockTarget();
- try {
- ((Target)getTarget()).setCurrentThread(this);
- getTarget().stepOverInstruction(count);
- } finally {
- ((Target)getTarget()).releaseTarget();
+ Target target = (Target)getTarget();
+ synchronized(target.getLock()) {
+ target.setCurrentThread(this);
+ target.stepOverInstruction(count);
}
}
@@ -422,12 +402,10 @@ public class Thread extends CObject implements ICDIThread {
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteStep#stepUntil(org.eclipse.cdt.debug.core.cdi.ICDILocation)
*/
public void stepUntil(ICDILocation location) throws CDIException {
- ((Target)getTarget()).lockTarget();
- try {
- ((Target)getTarget()).setCurrentThread(this);
- getTarget().stepUntil(location);
- } finally {
- ((Target)getTarget()).releaseTarget();
+ Target target = (Target)getTarget();
+ synchronized(target.getLock()) {
+ target.setCurrentThread(this);
+ target.stepUntil(location);
}
}
@@ -457,24 +435,20 @@ public class Thread extends CObject implements ICDIThread {
*/
public void resume(boolean passSignal) throws CDIException {
- ((Target)getTarget()).lockTarget();
- try {
- ((Target)getTarget()).setCurrentThread(this);
- getTarget().resume(passSignal);
- } finally {
- ((Target)getTarget()).releaseTarget();
+ Target target = (Target)getTarget();
+ synchronized(target.getLock()) {
+ target.setCurrentThread(this);
+ target.resume(passSignal);
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume#resume(org.eclipse.cdt.debug.core.cdi.ICDILocation)
*/
public void resume(ICDILocation location) throws CDIException {
- ((Target)getTarget()).lockTarget();
- try {
- ((Target)getTarget()).setCurrentThread(this);
- getTarget().resume(location);
- } finally {
- ((Target)getTarget()).releaseTarget();
+ Target target = (Target)getTarget();
+ synchronized(target.getLock()) {
+ target.setCurrentThread(this);
+ target.resume(location);
}
}
@@ -482,12 +456,10 @@ public class Thread extends CObject implements ICDIThread {
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIExecuteResume#resume(org.eclipse.cdt.debug.core.cdi.model.ICDISignal)
*/
public void resume(ICDISignal signal) throws CDIException {
- ((Target)getTarget()).lockTarget();
- try {
- ((Target)getTarget()).setCurrentThread(this);
- getTarget().resume(signal);
- } finally {
- ((Target)getTarget()).releaseTarget();
+ Target target = (Target)getTarget();
+ synchronized(target.getLock()) {
+ target.setCurrentThread(this);
+ target.resume(signal);
}
}
diff --git a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/VariableDescriptor.java b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/VariableDescriptor.java
index 68fbe22b2e5..9c3e524a828 100644
--- a/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/VariableDescriptor.java
+++ b/debug/org.eclipse.cdt.debug.mi.core/cdi/org/eclipse/cdt/debug/mi/core/cdi/model/VariableDescriptor.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2006 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
+ * Alena Laskavaia (QNX) - Bug 221224
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi.model;
@@ -240,7 +241,7 @@ public abstract class VariableDescriptor extends CObject implements ICDIVariable
StackFrame currentFrame = currentThread.getCurrentStackFrame();
StackFrame frame = (StackFrame)getStackFrame();
Thread thread = (Thread)getThread();
- target.lockTarget();
+ synchronized(target.getLock()) {
try {
if (frame != null) {
target.setCurrentThread(frame.getThread(), false);
@@ -261,17 +262,14 @@ public abstract class VariableDescriptor extends CObject implements ICDIVariable
} catch (MIException e) {
throw new MI2CDIException(e);
} finally {
- try {
- if (frame != null) {
- target.setCurrentThread(currentThread, false);
- currentThread.setCurrentStackFrame(currentFrame, false);
- } else if (thread != null) {
- target.setCurrentThread(currentThread, false);
- }
- } finally {
- target.releaseTarget();
+ if (frame != null) {
+ target.setCurrentThread(currentThread, false);
+ currentThread.setCurrentStackFrame(currentFrame, false);
+ } else if (thread != null) {
+ target.setCurrentThread(currentThread, false);
}
}
+ }
}
if (sizeof != null) {

Back to the top