Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreutarass2008-02-15 16:45:25 -0500
committereutarass2008-02-15 16:45:25 -0500
commit5ac36a50b1e59e1c89d7f8c4a549f52205928f66 (patch)
tree9cd06cefbc27700422054a451bf990a14462d711
parent6459bb640308817d92790bb1b7b61348c5418ba8 (diff)
downloadorg.eclipse.tcf-5ac36a50b1e59e1c89d7f8c4a549f52205928f66.tar.gz
org.eclipse.tcf-5ac36a50b1e59e1c89d7f8c4a549f52205928f66.tar.xz
org.eclipse.tcf-5ac36a50b1e59e1c89d7f8c4a549f52205928f66.zip
The new version 0.2.0 of Target Communication Framework has major improvements
in several areas: 1. Target agent improvements: a. Generic communication and discovery code is separated from TCP/IP specific code. Now the agent can support multiple transport protocols simultaneously. b. Multiple agents can run on same host. One of them is automatically elected to be a master discovery server. c. Agent now can have different sets of services on different server sockets. 2. TCF debugger prototype is reworked in order to improve remote data caching logic. Now, for example, stack frame attributes, like source code position, are reused from cache when a thread is suspended; only frames that did not change during thread execution are reused - usually bottom part of a stack. 3. DSF/TCF integration is extended to include TCF implementation of several DSF services. 4. Many bugs are fixed in the code.
-rw-r--r--docs/TCF Context Identifier Explanation.html28
-rw-r--r--docs/TCF Linux Agent Prototype.html26
-rw-r--r--docs/TCF Service - System Monitor.html4
-rw-r--r--examples/com.windriver.tcf.examples.daytime/.classpath7
-rw-r--r--examples/com.windriver.tcf.examples.daytime/.project28
-rw-r--r--examples/com.windriver.tcf.examples.daytime/META-INF/MANIFEST.MF11
-rw-r--r--examples/com.windriver.tcf.examples.daytime/about.html28
-rw-r--r--examples/com.windriver.tcf.examples.daytime/build.properties6
-rw-r--r--examples/com.windriver.tcf.examples.daytime/plugin.xml9
-rw-r--r--examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/Activator.java49
-rw-r--r--examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/DaytimeServiceProxy.java63
-rw-r--r--examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/IDaytimeService.java42
-rw-r--r--plugins/com.windriver.debug.tcf.core/.classpath2
-rw-r--r--plugins/com.windriver.debug.tcf.core/.settings/org.eclipse.jdt.core.prefs261
-rw-r--r--plugins/com.windriver.debug.tcf.core/.settings/org.eclipse.jdt.ui.prefs4
-rw-r--r--plugins/com.windriver.debug.tcf.core/META-INF/MANIFEST.MF8
-rw-r--r--plugins/com.windriver.debug.tcf.core/build.properties6
-rw-r--r--plugins/com.windriver.debug.tcf.core/plugin.xml1
-rw-r--r--plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/TCFCore.java39
-rw-r--r--plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/ITCFBreakpointListener.java1
-rw-r--r--plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsModel.java195
-rw-r--r--plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsStatus.java10
-rw-r--r--plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFLaunch.java8
-rw-r--r--plugins/com.windriver.debug.tcf.ui/.classpath2
-rw-r--r--plugins/com.windriver.debug.tcf.ui/.cvsignore2
-rw-r--r--plugins/com.windriver.debug.tcf.ui/.settings/org.eclipse.jdt.core.prefs261
-rw-r--r--plugins/com.windriver.debug.tcf.ui/.settings/org.eclipse.jdt.ui.prefs4
-rw-r--r--plugins/com.windriver.debug.tcf.ui/META-INF/MANIFEST.MF3
-rw-r--r--plugins/com.windriver.debug.tcf.ui/build.properties6
-rw-r--r--plugins/com.windriver.debug.tcf.ui/plugin.xml2
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFMainTab.java5
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFSelfTest.java47
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildren.java34
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenExecContext.java163
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenRegisters.java42
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java86
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModel.java128
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModelPresentation.java4
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNode.java203
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeExecContext.java293
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeLaunch.java26
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeRegister.java104
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeStackFrame.java141
-rw-r--r--plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFRunnable.java14
-rw-r--r--plugins/com.windriver.tcf.api/.classpath2
-rw-r--r--plugins/com.windriver.tcf.api/.settings/org.eclipse.jdt.core.prefs261
-rw-r--r--plugins/com.windriver.tcf.api/.settings/org.eclipse.jdt.ui.prefs4
-rw-r--r--plugins/com.windriver.tcf.api/META-INF/MANIFEST.MF5
-rw-r--r--plugins/com.windriver.tcf.api/build.properties5
-rw-r--r--plugins/com.windriver.tcf.api/plugin.xml7
-rw-r--r--plugins/com.windriver.tcf.api/schema/startup.exsd (renamed from plugins/com.windriver.debug.tcf.core/schema/startup.exsd)6
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/Activator.java36
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/core/AbstractChannel.java39
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/local/LocatorService.java3
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/MemoryProxy.java4
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/ProcessesProxy.java2
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/RunControlProxy.java8
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/StackTraceProxy.java10
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/protocol/IChannel.java21
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IMemory.java10
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IRunControl.java1
-rw-r--r--plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/ISysMonitor.java6
-rw-r--r--plugins/com.windriver.tcf.dsf.core/.classpath2
-rw-r--r--plugins/com.windriver.tcf.dsf.core/.settings/org.eclipse.jdt.core.prefs272
-rw-r--r--plugins/com.windriver.tcf.dsf.core/.settings/org.eclipse.jdt.ui.prefs4
-rw-r--r--plugins/com.windriver.tcf.dsf.core/META-INF/MANIFEST.MF4
-rw-r--r--plugins/com.windriver.tcf.dsf.core/build.properties5
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFExecuter.java10
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFLaunch.java28
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFLaunchSequence.java83
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/IDataRequest.java17
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFAddress.java85
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFBreakpoints.java307
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFExecutionDMC.java36
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFMemory.java307
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFNativeProcesses.java510
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFProcessDMC.java2
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFRegisters.java1060
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFRunControl.java1006
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFStack.java516
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFStepQueueManager.java233
-rw-r--r--plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDataCache.java105
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/.classpath2
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/.settings/org.eclipse.jdt.core.prefs272
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/.settings/org.eclipse.jdt.ui.prefs4
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/META-INF/MANIFEST.MF3
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/build.properties6
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/plugin.xml14
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/Activator.java77
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/AdapterFactory.java146
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ContainerLayoutNode.java52
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchDialogTabGroup.java10
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchVMProvider.java81
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ThreadLayoutNode.java12
-rw-r--r--plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ViewModelAdapter.java74
-rw-r--r--plugins/com.windriver.tcf.rse.ui/.classpath2
-rw-r--r--plugins/com.windriver.tcf.rse.ui/.settings/org.eclipse.jdt.core.prefs272
-rw-r--r--plugins/com.windriver.tcf.rse.ui/.settings/org.eclipse.jdt.ui.prefs4
-rw-r--r--plugins/com.windriver.tcf.rse.ui/META-INF/MANIFEST.MF3
-rw-r--r--plugins/com.windriver.tcf.rse.ui/build.properties6
-rw-r--r--plugins/com.windriver.tcf.rse.ui/plugin.xml2
-rw-r--r--plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileResource.java8
-rw-r--r--plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileService.java14
-rw-r--r--plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFRemoteFile.java26
104 files changed, 7085 insertions, 1433 deletions
diff --git a/docs/TCF Context Identifier Explanation.html b/docs/TCF Context Identifier Explanation.html
index 79e5d09f4..956c56cf2 100644
--- a/docs/TCF Context Identifier Explanation.html
+++ b/docs/TCF Context Identifier Explanation.html
@@ -1,20 +1,20 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1251">
- <TITLE>TCF Context Identifier Explanation</TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 2.2 (Win32)">
- <META NAME="CREATED" CONTENT="20070830;12134342">
- <META NAME="CHANGEDBY" CONTENT="Eugene Tarassov">
- <META NAME="CHANGED" CONTENT="20070830;12351368">
- <STYLE TYPE="text/css">
- <!--
- H1 { color: #000000 }
- P { color: #000000 }
- P.western { font-size: 13pt }
- H2 { color: #000000 }
- -->
- </STYLE>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1251">
+ <TITLE>TCF Context Identifier Explanation</TITLE>
+ <META NAME="GENERATOR" CONTENT="OpenOffice.org 2.2 (Win32)">
+ <META NAME="CREATED" CONTENT="20070830;12134342">
+ <META NAME="CHANGEDBY" CONTENT="Eugene Tarassov">
+ <META NAME="CHANGED" CONTENT="20070830;12351368">
+ <STYLE TYPE="text/css">
+ <!--
+ H1 { color: #000000 }
+ P { color: #000000 }
+ P.western { font-size: 13pt }
+ H2 { color: #000000 }
+ -->
+ </STYLE>
</HEAD>
<BODY LANG="en-US" TEXT="#000000" DIR="LTR">
<P CLASS="western" STYLE="border-top: none; border-bottom: 1.00pt solid #4f81bd; border-left: none; border-right: none; padding-top: 0in; padding-bottom: 0.06in; padding-left: 0in; padding-right: 0in">
diff --git a/docs/TCF Linux Agent Prototype.html b/docs/TCF Linux Agent Prototype.html
index 50ec8e8fe..5d6ce24e6 100644
--- a/docs/TCF Linux Agent Prototype.html
+++ b/docs/TCF Linux Agent Prototype.html
@@ -1,19 +1,19 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1251">
- <TITLE>This is a brief description of the TCF Linux user-mode agent prototype implementation</TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 2.2 (Win32)">
- <META NAME="CREATED" CONTENT="20070830;12381303">
- <META NAME="CHANGED" CONTENT="16010101;0">
- <STYLE TYPE="text/css">
- <!--
- H1 { color: #000000 }
- P { color: #000000 }
- P.western { font-size: 13pt }
- H2 { color: #000000 }
- -->
- </STYLE>
+ <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1251">
+ <TITLE>This is a brief description of the TCF Linux user-mode agent prototype implementation</TITLE>
+ <META NAME="GENERATOR" CONTENT="OpenOffice.org 2.2 (Win32)">
+ <META NAME="CREATED" CONTENT="20070830;12381303">
+ <META NAME="CHANGED" CONTENT="16010101;0">
+ <STYLE TYPE="text/css">
+ <!--
+ H1 { color: #000000 }
+ P { color: #000000 }
+ P.western { font-size: 13pt }
+ H2 { color: #000000 }
+ -->
+ </STYLE>
</HEAD>
<BODY LANG="en-US" TEXT="#000000" DIR="LTR">
diff --git a/docs/TCF Service - System Monitor.html b/docs/TCF Service - System Monitor.html
index 882e91094..fb9dbd1ed 100644
--- a/docs/TCF Service - System Monitor.html
+++ b/docs/TCF Service - System Monitor.html
@@ -503,7 +503,7 @@ R • <i>&lt;token&gt;</i> • <i>&lt;error report&gt;</i> • <i>&lt;array of string&
<font color=#3F5FBF>/** Scheduling policy */</font>
PROP_POLICY = "Policy";
-
+
<font color=#3F5FBF>/**
* A context corresponds to an execution thread, process, address space, etc.
* A context can belong to a parent context. Contexts hierarchy can be simple
@@ -514,7 +514,7 @@ R • <i>&lt;token&gt;</i> • <i>&lt;error report&gt;</i> • <i>&lt;array of string&
* attributes and functionality, which is relevant to that service.
*/</font>
<font color=#7F0055>interface</font> SysMonitorContext {
-
+
<font color=#3F5FBF>/**
* Get context ID.
* Same as getProperties().get(“ID”)
diff --git a/examples/com.windriver.tcf.examples.daytime/.classpath b/examples/com.windriver.tcf.examples.daytime/.classpath
new file mode 100644
index 000000000..021596729
--- /dev/null
+++ b/examples/com.windriver.tcf.examples.daytime/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/examples/com.windriver.tcf.examples.daytime/.project b/examples/com.windriver.tcf.examples.daytime/.project
new file mode 100644
index 000000000..48540c766
--- /dev/null
+++ b/examples/com.windriver.tcf.examples.daytime/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>com.windriver.tcf.examples.daytime</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/examples/com.windriver.tcf.examples.daytime/META-INF/MANIFEST.MF b/examples/com.windriver.tcf.examples.daytime/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..922606346
--- /dev/null
+++ b/examples/com.windriver.tcf.examples.daytime/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Examples Plug-in
+Bundle-SymbolicName: com.windriver.tcf.examples.daytime;singleton:=true
+Bundle-Version: 0.2.0
+Bundle-Activator: com.windriver.tcf.examples.daytime.Activator
+Bundle-Vendor: WINDRIVER
+Require-Bundle: org.eclipse.core.runtime,
+ com.windriver.tcf.api
+Eclipse-LazyStart: true
+Export-Package: com.windriver.tcf.examples.daytime
diff --git a/examples/com.windriver.tcf.examples.daytime/about.html b/examples/com.windriver.tcf.examples.daytime/about.html
new file mode 100644
index 000000000..6c5b3615b
--- /dev/null
+++ b/examples/com.windriver.tcf.examples.daytime/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>January 10, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/examples/com.windriver.tcf.examples.daytime/build.properties b/examples/com.windriver.tcf.examples.daytime/build.properties
new file mode 100644
index 000000000..2d5759904
--- /dev/null
+++ b/examples/com.windriver.tcf.examples.daytime/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html
diff --git a/examples/com.windriver.tcf.examples.daytime/plugin.xml b/examples/com.windriver.tcf.examples.daytime/plugin.xml
new file mode 100644
index 000000000..649ea70dc
--- /dev/null
+++ b/examples/com.windriver.tcf.examples.daytime/plugin.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+
+ <extension point="com.windriver.tcf.api.startup">
+ <class name="com.windriver.tcf.examples.daytime.DaytimeServiceProxy"/>
+ </extension>
+
+</plugin>
diff --git a/examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/Activator.java b/examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/Activator.java
new file mode 100644
index 000000000..1b1ff794e
--- /dev/null
+++ b/examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/Activator.java
@@ -0,0 +1,49 @@
+package com.windriver.tcf.examples.daytime;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "com.windriver.tcf.examples";
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+}
diff --git a/examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/DaytimeServiceProxy.java b/examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/DaytimeServiceProxy.java
new file mode 100644
index 000000000..2bf385471
--- /dev/null
+++ b/examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/DaytimeServiceProxy.java
@@ -0,0 +1,63 @@
+package com.windriver.tcf.examples.daytime;
+
+import com.windriver.tcf.api.core.Command;
+import com.windriver.tcf.api.protocol.IChannel;
+import com.windriver.tcf.api.protocol.IToken;
+import com.windriver.tcf.api.protocol.Protocol;
+
+public class DaytimeServiceProxy implements IDaytimeService {
+
+ private final IChannel channel;
+
+ DaytimeServiceProxy(IChannel channel) {
+ this.channel = channel;
+ }
+
+ /**
+ * Return service name, as it appears on the wire - a TCF name of the service.
+ */
+ public String getName() {
+ return NAME;
+ }
+
+ /**
+ * The method translates arguments to JSON string and sends the command message
+ * to remote server. When response arrives, it is translated from JSON to
+ * Java object, which are used to call call-back object.
+ *
+ * The translation (marshaling) is done by using utility class Command.
+ */
+ public IToken getTimeOfDay(String tz, final DoneGetTimeOfDay done) {
+ return new Command(channel, this, "getTimeOfDay", new Object[]{ tz }) {
+ @Override
+ public void done(Exception error, Object[] args) {
+ String str = null;
+ if (error == null) {
+ assert args.length == 3;
+ error = toError(args[0], args[1]);
+ str = (String)args[2];
+ }
+ done.doneGetTimeOfDay(token, error, str);
+ }
+ }.token;
+ }
+
+ static {
+ /*
+ * Make Daytime Service proxy available to all potential clients by creating
+ * the proxy object every time a TCF communication channel is opened.
+ * Note: extension point "com.windriver.tcf.api.startup" is used to load this class
+ * at TCF startup time, so proxy factory is properly activated even if nobody
+ * import directly from this plugin.
+ */
+ Protocol.addChannelOpenListener(new Protocol.ChannelOpenListener() {
+
+ public void onChannelOpen(IChannel channel) {
+ // Check if remote server provides Daytime service
+ if (channel.getRemoteService(IDaytimeService.NAME) == null) return;
+ // Create service proxy
+ channel.setServiceProxy(IDaytimeService.class, new DaytimeServiceProxy(channel));
+ }
+ });
+ }
+}
diff --git a/examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/IDaytimeService.java b/examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/IDaytimeService.java
new file mode 100644
index 000000000..a8cf242fe
--- /dev/null
+++ b/examples/com.windriver.tcf.examples.daytime/src/com/windriver/tcf/examples/daytime/IDaytimeService.java
@@ -0,0 +1,42 @@
+package com.windriver.tcf.examples.daytime;
+
+import com.windriver.tcf.api.protocol.IService;
+import com.windriver.tcf.api.protocol.IToken;
+
+/**
+ * IDaytimeService allows retrieving the time of day from a remote system.
+ */
+public interface IDaytimeService extends IService {
+
+ /**
+ * This service name, as it appears on the wire - a TCF name of the service.
+ */
+ public static final String NAME = "Daytime";
+
+ /**
+ * Retrieve the time of day from remote system.
+ * The method sends the command to remote server and returns -
+ * it does not wait for the server response. Instead a client should provide
+ * a call-back object that will be called when the server answers the command
+ * or when the command is aborted by communication error.
+ * @param tz - time zone name.
+ * @param done - a call-back object.
+ * @return a handle for the pending command. The handle can be used to cancel the command,
+ * and to match responses to requests - if same call-back object is used for
+ * multiple requests.
+ */
+ IToken getTimeOfDay(String tz, DoneGetTimeOfDay done);
+
+ /**
+ * Call-back interface for getTimeOfDay() command.
+ */
+ interface DoneGetTimeOfDay {
+ /**
+ * This method is called when getTimeOfDay() command is completed.
+ * @param token - pending command handle.
+ * @param error - null if the command is successful.
+ * @param str - a String of the form "01 MAR 2006 11:25:12 CET"
+ */
+ void doneGetTimeOfDay(IToken token, Exception error, String str);
+ }
+}
diff --git a/plugins/com.windriver.debug.tcf.core/.classpath b/plugins/com.windriver.debug.tcf.core/.classpath
index 751c8f2e5..304e86186 100644
--- a/plugins/com.windriver.debug.tcf.core/.classpath
+++ b/plugins/com.windriver.debug.tcf.core/.classpath
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/plugins/com.windriver.debug.tcf.core/.settings/org.eclipse.jdt.core.prefs b/plugins/com.windriver.debug.tcf.core/.settings/org.eclipse.jdt.core.prefs
index f06d39b5d..0bf81e2f5 100644
--- a/plugins/com.windriver.debug.tcf.core/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/com.windriver.debug.tcf.core/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,4 @@
-#Mon Sep 10 12:24:12 PDT 2007
+#Tue Feb 05 15:38:16 CET 2008
eclipse.preferences.version=1
org.eclipse.jdt.core.builder.cleanOutputFolder=clean
org.eclipse.jdt.core.builder.duplicateResourceTask=warning
@@ -8,6 +8,265 @@ org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,.svn/
org.eclipse.jdt.core.circularClasspath=error
org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=8
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/plugins/com.windriver.debug.tcf.core/.settings/org.eclipse.jdt.ui.prefs b/plugins/com.windriver.debug.tcf.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 000000000..2a1f92d89
--- /dev/null
+++ b/plugins/com.windriver.debug.tcf.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jan 07 15:38:24 PST 2008
+eclipse.preferences.version=1
+formatter_profile=_Java STD
+formatter_settings_version=11
diff --git a/plugins/com.windriver.debug.tcf.core/META-INF/MANIFEST.MF b/plugins/com.windriver.debug.tcf.core/META-INF/MANIFEST.MF
index 46a4bff9e..bb5e7240d 100644
--- a/plugins/com.windriver.debug.tcf.core/META-INF/MANIFEST.MF
+++ b/plugins/com.windriver.debug.tcf.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: com.windriver.debug.tcf.core;singleton:=true
-Bundle-Version: 0.1.0
+Bundle-Version: 0.2.0
Bundle-Activator: com.windriver.debug.tcf.core.TCFCore
Bundle-Vendor: %providerName
Require-Bundle: org.eclipse.core.runtime,
@@ -10,6 +10,8 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.core.resources,
com.windriver.tcf.api
Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
Eclipse-LazyStart: true
-Export-Package: com.windriver.debug.tcf.core.model,
- com.windriver.debug.tcf.core.launch
+Export-Package: com.windriver.debug.tcf.core,
+ com.windriver.debug.tcf.core.launch,
+ com.windriver.debug.tcf.core.model
diff --git a/plugins/com.windriver.debug.tcf.core/build.properties b/plugins/com.windriver.debug.tcf.core/build.properties
index e9863e281..1f9e1f7be 100644
--- a/plugins/com.windriver.debug.tcf.core/build.properties
+++ b/plugins/com.windriver.debug.tcf.core/build.properties
@@ -2,4 +2,8 @@ source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
- plugin.xml
+ plugin.xml,\
+ about.html,\
+ plugin.properties
+src.includes = schema/,\
+ about.html
diff --git a/plugins/com.windriver.debug.tcf.core/plugin.xml b/plugins/com.windriver.debug.tcf.core/plugin.xml
index 1a9590a32..f28e8659f 100644
--- a/plugins/com.windriver.debug.tcf.core/plugin.xml
+++ b/plugins/com.windriver.debug.tcf.core/plugin.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
- <extension-point id="startup" name="TCF Startup" schema="schema/startup.exsd"/>
<extension
point="org.eclipse.debug.core.breakpoints">
<breakpoint
diff --git a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/TCFCore.java b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/TCFCore.java
index e4ffe006d..ca6c4eab8 100644
--- a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/TCFCore.java
+++ b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/TCFCore.java
@@ -10,11 +10,7 @@
*******************************************************************************/
package com.windriver.debug.tcf.core;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.osgi.framework.BundleContext;
@@ -41,7 +37,6 @@ public class TCFCore extends Plugin {
public void start(BundleContext context) throws Exception {
super.start(context);
bp_model = new TCFBreakpointsModel();
- runTCFStartup();
}
@Override
@@ -52,31 +47,6 @@ public class TCFCore extends Plugin {
super.stop(context);
}
- private void runTCFStartup() {
- try {
- IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, "startup");
- IExtension[] extensions = point.getExtensions();
- for (int i = 0; i < extensions.length; i++) {
- try {
- Platform.getBundle(extensions[i].getNamespaceIdentifier()).start();
- IConfigurationElement[] e = extensions[i].getConfigurationElements();
- for (int j = 0; j < e.length; j++) {
- String nm = e[j].getName();
- if (nm.equals("class")) { //$NON-NLS-1$
- Class.forName(e[j].getAttribute("name")); //$NON-NLS-1$
- }
- }
- }
- catch (Throwable x) {
- log("TCF startup error", x);
- }
- }
- }
- catch (Exception x) {
- log("TCF startup error", x);
- }
- }
-
/**
* Returns the shared instance
*
@@ -96,7 +66,12 @@ public class TCFCore extends Plugin {
* @param err - exception
*/
public static void log(String msg, Throwable err) {
- getDefault().getLog().log(new Status(IStatus.ERROR,
- getDefault().getBundle().getSymbolicName(), IStatus.OK, msg, err));
+ if (plugin == null || plugin.getLog() == null) {
+ err.printStackTrace();
+ }
+ else {
+ plugin.getLog().log(new Status(IStatus.ERROR,
+ plugin.getBundle().getSymbolicName(), IStatus.OK, msg, err));
+ }
}
}
diff --git a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/ITCFBreakpointListener.java b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/ITCFBreakpointListener.java
index a78f8127f..a5f1eb8f4 100644
--- a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/ITCFBreakpointListener.java
+++ b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/ITCFBreakpointListener.java
@@ -13,4 +13,5 @@ package com.windriver.debug.tcf.core.model;
public interface ITCFBreakpointListener {
public void breakpointStatusChanged(String id);
+ public void breakpointRemoved(String id);
}
diff --git a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsModel.java b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsModel.java
index a1998a9e2..9269368f0 100644
--- a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsModel.java
+++ b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsModel.java
@@ -37,72 +37,16 @@ import com.windriver.tcf.api.protocol.IToken;
import com.windriver.tcf.api.protocol.Protocol;
import com.windriver.tcf.api.services.IBreakpoints;
+/**
+ * TCFBreakpointsModel class handles breakpoints for all active TCF launches.
+ * It downloads initial set of breakpoint data when launch is activated,
+ * listens for Eclipse breakpoint manager events and propagates breakpoint changes to TCF targets.
+ */
public class TCFBreakpointsModel implements IBreakpointListener, IBreakpointManagerListener {
private static final String PROP_ID = "ID";
private final IBreakpointManager bp_manager = DebugPlugin.getDefault().getBreakpointManager();
- private abstract class BreakpointUpdate implements Runnable {
-
- private final ILaunch[] launches;
- private final Map<String,Object> marker_attrs;
- private final String marker_file;
-
- IBreakpoints service;
- IBreakpoints.DoneCommand done;
- Map<String,Object> tcf_attrs;
-
- @SuppressWarnings("unchecked")
- BreakpointUpdate(IBreakpoint breakpoint) throws CoreException, IOException {
- if (breakpoint == null) {
- marker_attrs = null;
- marker_file = null;
- }
- else {
- marker_attrs = new HashMap<String,Object>(breakpoint.getMarker().getAttributes());
- marker_file = getFilePath(breakpoint.getMarker().getResource());
- }
- launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
- }
-
- synchronized void exec() throws InterruptedException {
- assert !Protocol.isDispatchThread();
- Protocol.invokeLater(this);
- wait();
- }
-
- public void run() {
- if (marker_attrs != null) {
- tcf_attrs = toBreakpointAttributes(marker_file, marker_attrs);
- }
- for (int i = 0; i < launches.length; i++) {
- if (launches[i] instanceof TCFLaunch) {
- TCFLaunch launch = (TCFLaunch)launches[i];
- final IChannel channel = launch.getChannel();
- if (channel == null) continue;
- if (channel.getState() != IChannel.STATE_OPEN) continue;
- service = channel.getRemoteService(IBreakpoints.class);
- if (service == null) continue;
- done = new IBreakpoints.DoneCommand() {
- public void doneCommand(IToken token, Exception error) {
- if (error != null) channel.terminate(error);
- }
- };
- update();
- }
- }
- Protocol.sync(new Runnable() {
- public void run() {
- synchronized (BreakpointUpdate.this) {
- BreakpointUpdate.this.notify();
- }
- }
- });
- };
-
- abstract void update();
- }
-
public TCFBreakpointsModel() {
bp_manager.addBreakpointListener(this);
bp_manager.addBreakpointManagerListener(this);
@@ -113,6 +57,11 @@ public class TCFBreakpointsModel implements IBreakpointListener, IBreakpointMana
bp_manager.removeBreakpointManagerListener(this);
}
+ public boolean isSupported(IChannel channel, IBreakpoint bp) {
+ // TODO implement per-channel breakpoint filtering
+ return true;
+ }
+
@SuppressWarnings("unchecked")
public void downloadBreakpoints(final IChannel channel, final Runnable done)
throws IOException, CoreException {
@@ -123,6 +72,7 @@ public class TCFBreakpointsModel implements IBreakpointListener, IBreakpointMana
if (arr != null && arr.length > 0) {
Map<String,Object>[] bps = new Map[arr.length];
for (int i = 0; i < arr.length; i++) {
+ if (!isSupported(channel, arr[i])) continue;
IMarker marker = arr[i].getMarker();
String file = getFilePath(marker.getResource());
bps[i] = toBreakpointAttributes(file, marker.getAttributes());
@@ -143,32 +93,125 @@ public class TCFBreakpointsModel implements IBreakpointListener, IBreakpointMana
try {
IBreakpoint[] arr = bp_manager.getBreakpoints(ITCFConstants.ID_TCF_DEBUG_MODEL);
if (arr == null || arr.length == 0) return;
- final Set<String> ids = new HashSet<String>();
+ final Map<String,IBreakpoint> map = new HashMap<String,IBreakpoint>();
for (int i = 0; i < arr.length; i++) {
IMarker marker = arr[i].getMarker();
Boolean b = marker.getAttribute(IBreakpoint.ENABLED, Boolean.FALSE);
if (!b.booleanValue()) continue;
- ids.add(marker.getAttribute(
- ITCFConstants.ID_TCF_DEBUG_MODEL + '.' + IBreakpoints.PROP_ID, (String)null));
+ String id = marker.getAttribute(ITCFConstants.ID_TCF_DEBUG_MODEL +
+ '.' + IBreakpoints.PROP_ID, (String)null);
+ map.put(id, arr[i]);
}
- if (ids.isEmpty()) return;
- new BreakpointUpdate(null) {
- @Override
- void update() {
- if (enabled) {
- service.enable(ids.toArray(new String[ids.size()]), done);
- }
- else {
- service.disable(ids.toArray(new String[ids.size()]), done);
+ if (map.isEmpty()) return;
+ final ILaunch[] launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
+ Runnable r = new Runnable() {
+ public void run() {
+ for (int i = 0; i < launches.length; i++) {
+ if (launches[i] instanceof TCFLaunch) {
+ TCFLaunch launch = (TCFLaunch)launches[i];
+ final IChannel channel = launch.getChannel();
+ if (channel == null) continue;
+ if (channel.getState() != IChannel.STATE_OPEN) continue;
+ IBreakpoints service = channel.getRemoteService(IBreakpoints.class);
+ if (service == null) continue;
+ Set<String> ids = new HashSet<String>();
+ for (String id : map.keySet()) {
+ IBreakpoint bp = map.get(id);
+ if (isSupported(channel, bp)) ids.add(id);
+ }
+ IBreakpoints.DoneCommand done = new IBreakpoints.DoneCommand() {
+ public void doneCommand(IToken token, Exception error) {
+ if (error != null) channel.terminate(error);
+ }
+ };
+ if (enabled) {
+ service.enable(ids.toArray(new String[ids.size()]), done);
+ }
+ else {
+ service.disable(ids.toArray(new String[ids.size()]), done);
+ }
+ }
}
+ Protocol.sync(new Runnable() {
+ public void run() {
+ synchronized (map) {
+ map.notify();
+ }
+ }
+ });
}
- }.exec();
+ };
+ synchronized (map) {
+ assert !Protocol.isDispatchThread();
+ Protocol.invokeLater(r);
+ map.wait();
+ }
}
catch (Throwable x) {
TCFCore.log("Unhandled exception in breakpoint listener", x);
}
}
+ private abstract class BreakpointUpdate implements Runnable {
+
+ private final IBreakpoint breakpoint;
+ private final ILaunch[] launches;
+ private final Map<String,Object> marker_attrs;
+ private final String marker_file;
+
+ IBreakpoints service;
+ IBreakpoints.DoneCommand done;
+ Map<String,Object> tcf_attrs;
+
+ @SuppressWarnings("unchecked")
+ BreakpointUpdate(IBreakpoint breakpoint) throws CoreException, IOException {
+ this.breakpoint = breakpoint;
+ marker_attrs = new HashMap<String,Object>(breakpoint.getMarker().getAttributes());
+ marker_file = getFilePath(breakpoint.getMarker().getResource());
+ launches = DebugPlugin.getDefault().getLaunchManager().getLaunches();
+ }
+
+ synchronized void exec() throws InterruptedException {
+ assert !Protocol.isDispatchThread();
+ Protocol.invokeLater(this);
+ wait();
+ }
+
+ public void run() {
+ tcf_attrs = toBreakpointAttributes(marker_file, marker_attrs);
+ for (int i = 0; i < launches.length; i++) {
+ if (launches[i] instanceof TCFLaunch) {
+ final TCFLaunch launch = (TCFLaunch)launches[i];
+ final IChannel channel = launch.getChannel();
+ if (channel == null) continue;
+ if (channel.getState() != IChannel.STATE_OPEN) continue;
+ service = channel.getRemoteService(IBreakpoints.class);
+ if (service == null) continue;
+ if (!isSupported(channel, breakpoint)) continue;
+ done = new IBreakpoints.DoneCommand() {
+ public void doneCommand(IToken token, Exception error) {
+ if (error != null) channel.terminate(error);
+ else done(launch);
+ }
+ };
+ update();
+ }
+ }
+ Protocol.sync(new Runnable() {
+ public void run() {
+ synchronized (BreakpointUpdate.this) {
+ BreakpointUpdate.this.notify();
+ }
+ }
+ });
+ };
+
+ void done(TCFLaunch launch) {
+ }
+
+ abstract void update();
+ }
+
private String getFilePath(IResource resource) throws IOException {
if (resource == ResourcesPlugin.getWorkspace().getRoot()) return null;
IPath p = resource.getRawLocation();
@@ -250,6 +293,10 @@ public class TCFBreakpointsModel implements IBreakpointListener, IBreakpointMana
void update() {
service.remove(new String[]{ (String)tcf_attrs.get(PROP_ID) }, done);
}
+ @Override
+ void done(TCFLaunch launch) {
+ launch.getBreakpointsStatus().removeStatus((String)tcf_attrs.get(PROP_ID));
+ }
}.exec();
}
catch (Throwable x) {
diff --git a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsStatus.java b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsStatus.java
index a9a6cb735..a0a5f74cc 100644
--- a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsStatus.java
+++ b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFBreakpointsStatus.java
@@ -27,6 +27,7 @@ public class TCFBreakpointsStatus {
private final IBreakpoints service;
private final Map<String,Map<String,Object>> status = new HashMap<String,Map<String,Object>>();
private final Set<ITCFBreakpointListener> listeners = new HashSet<ITCFBreakpointListener>();
+ private final Set<String> removed = new HashSet<String>();
private static final Map<String,Object> status_not_supported = new HashMap<String,Object>();
@@ -42,6 +43,7 @@ public class TCFBreakpointsStatus {
public void breakpointStatusChanged(String id, Map<String, Object> status) {
assert Protocol.isDispatchThread();
+ if (removed.contains(id)) return;
TCFBreakpointsStatus.this.status.put(id, status);
for (Iterator<ITCFBreakpointListener> i = listeners.iterator(); i.hasNext();) {
i.next().breakpointStatusChanged(id);
@@ -66,6 +68,14 @@ public class TCFBreakpointsStatus {
ITCFConstants.ID_TCF_DEBUG_MODEL + '.' + IBreakpoints.PROP_ID, null));
}
+ public void removeStatus(String id) {
+ status.remove(id);
+ removed.add(id);
+ for (Iterator<ITCFBreakpointListener> i = listeners.iterator(); i.hasNext();) {
+ i.next().breakpointRemoved(id);
+ }
+ }
+
public void addListener(ITCFBreakpointListener listener) {
assert Protocol.isDispatchThread();
listeners.add(listener);
diff --git a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFLaunch.java b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFLaunch.java
index a7a07eda7..4bf23c955 100644
--- a/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFLaunch.java
+++ b/plugins/com.windriver.debug.tcf.core/src/com/windriver/debug/tcf/core/model/TCFLaunch.java
@@ -37,7 +37,7 @@ public class TCFLaunch extends Launch {
public interface Listener {
- public void onConnected(TCFLaunch launch);
+ public void onConnected(TCFLaunch launch);
public void onDisconnected(TCFLaunch launch);
@@ -80,12 +80,12 @@ public class TCFLaunch extends Launch {
public void run() {
if (channel.getState() != IChannel.STATE_OPEN) return;
breakpoints_status = new TCFBreakpointsStatus(TCFLaunch.this);
- downloadApplication(done);
+ runLaunchSequence(done);
}
});
}
else {
- downloadApplication(done);
+ runLaunchSequence(done);
}
}
catch (Exception x) {
@@ -94,7 +94,7 @@ public class TCFLaunch extends Launch {
}
@SuppressWarnings("unchecked")
- protected void downloadApplication(final Runnable done) {
+ protected void runLaunchSequence(final Runnable done) {
try {
ILaunchConfiguration cfg = getLaunchConfiguration();
final String file = cfg.getAttribute(TCFLaunchDelegate.ATTR_PROGRAM_FILE, "");
diff --git a/plugins/com.windriver.debug.tcf.ui/.classpath b/plugins/com.windriver.debug.tcf.ui/.classpath
index 03ba07a5f..34c64f6b9 100644
--- a/plugins/com.windriver.debug.tcf.ui/.classpath
+++ b/plugins/com.windriver.debug.tcf.ui/.classpath
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
<accessrules>
<accessrule kind="accessible" pattern="org/eclipse/debug/**/provisional/**"/>
diff --git a/plugins/com.windriver.debug.tcf.ui/.cvsignore b/plugins/com.windriver.debug.tcf.ui/.cvsignore
index ba077a403..092357e47 100644
--- a/plugins/com.windriver.debug.tcf.ui/.cvsignore
+++ b/plugins/com.windriver.debug.tcf.ui/.cvsignore
@@ -1 +1 @@
-bin
+bin
diff --git a/plugins/com.windriver.debug.tcf.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/com.windriver.debug.tcf.ui/.settings/org.eclipse.jdt.core.prefs
index 78e20524b..0bf81e2f5 100644
--- a/plugins/com.windriver.debug.tcf.ui/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/com.windriver.debug.tcf.ui/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,4 @@
-#Mon Sep 10 12:26:30 PDT 2007
+#Tue Feb 05 15:38:16 CET 2008
eclipse.preferences.version=1
org.eclipse.jdt.core.builder.cleanOutputFolder=clean
org.eclipse.jdt.core.builder.duplicateResourceTask=warning
@@ -8,6 +8,265 @@ org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,.svn/
org.eclipse.jdt.core.circularClasspath=error
org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=8
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/plugins/com.windriver.debug.tcf.ui/.settings/org.eclipse.jdt.ui.prefs b/plugins/com.windriver.debug.tcf.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 000000000..12735e141
--- /dev/null
+++ b/plugins/com.windriver.debug.tcf.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jan 07 15:38:31 PST 2008
+eclipse.preferences.version=1
+formatter_profile=_Java STD
+formatter_settings_version=11
diff --git a/plugins/com.windriver.debug.tcf.ui/META-INF/MANIFEST.MF b/plugins/com.windriver.debug.tcf.ui/META-INF/MANIFEST.MF
index 4743cd6da..5f3d130f8 100644
--- a/plugins/com.windriver.debug.tcf.ui/META-INF/MANIFEST.MF
+++ b/plugins/com.windriver.debug.tcf.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: com.windriver.debug.tcf.ui;singleton:=true
-Bundle-Version: 0.1.0
+Bundle-Version: 0.2.0
Bundle-Activator: com.windriver.debug.tcf.ui.TCFUI
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -13,6 +13,7 @@ Require-Bundle: org.eclipse.ui,
com.windriver.debug.tcf.core,
com.windriver.tcf.api
Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
Eclipse-LazyStart: true
Export-Package: com.windriver.debug.tcf.ui.adapters,
com.windriver.debug.tcf.ui.launch
diff --git a/plugins/com.windriver.debug.tcf.ui/build.properties b/plugins/com.windriver.debug.tcf.ui/build.properties
index bbc49de86..bd51a9b0f 100644
--- a/plugins/com.windriver.debug.tcf.ui/build.properties
+++ b/plugins/com.windriver.debug.tcf.ui/build.properties
@@ -3,5 +3,9 @@ output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml,\
- bin/
+ about.html,\
+ plugin.properties,\
+ icons/
+src.includes = about.html
+
diff --git a/plugins/com.windriver.debug.tcf.ui/plugin.xml b/plugins/com.windriver.debug.tcf.ui/plugin.xml
index cc3b88d16..1b9952180 100644
--- a/plugins/com.windriver.debug.tcf.ui/plugin.xml
+++ b/plugins/com.windriver.debug.tcf.ui/plugin.xml
@@ -2,7 +2,7 @@
<?eclipse version="3.2"?>
<plugin>
- <extension point="com.windriver.debug.tcf.core.startup"/>
+ <extension point="com.windriver.tcf.api.startup"/>
<extension
id="com.windriver.debug.tcf.ui.adapters"
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFMainTab.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFMainTab.java
index 3e9168d3c..fb5892060 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFMainTab.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFMainTab.java
@@ -331,6 +331,11 @@ public class TCFMainTab extends AbstractLaunchConfigurationTab {
program_text = new Text(group, SWT.SINGLE | SWT.BORDER);
program_text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
program_text.setFont(font);
+ program_text.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ updateLaunchConfigurationDialog();
+ }
+ });
}
@Override
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFSelfTest.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFSelfTest.java
index 84208836d..65b7e5d03 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFSelfTest.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/launch/TCFSelfTest.java
@@ -60,6 +60,7 @@ class TCFSelfTest {
private int count_total;
private int count_done;
+ private boolean cancel;
private boolean canceled;
private boolean memory_lock;
@@ -127,7 +128,7 @@ class TCFSelfTest {
public void onChannelClosed(Throwable error) {
channel.removeChannelListener(this);
- if (error == null && (!active_tests.isEmpty() || !pending_tests.isEmpty())) {
+ if (error == null && (!active_tests.isEmpty() || !pending_tests.isEmpty()) && !cancel) {
error = new IOException("Remote peer closed connection before all tests finished");
}
int cnt = 0;
@@ -160,6 +161,7 @@ class TCFSelfTest {
}
void cancel() {
+ cancel = true;
if (canceled) return;
for (final Test t : active_tests.keySet()) {
if (t instanceof TestRCBP1) {
@@ -265,6 +267,7 @@ class TCFSelfTest {
private ISymbol func2;
private ISymbol array;
private int bp_cnt = 0;
+ private IToken cancel_test_cmd;
private class SuspendedContext {
final String id;
@@ -319,12 +322,12 @@ class TCFSelfTest {
}
public void doneRunTest(IToken token, Throwable error, String context_id) {
- assert active_tests.get(this) != null;
- assert this.context_id == null;
if (error != null) {
exit(error);
}
else {
+ assert active_tests.get(this) != null;
+ assert this.context_id == null;
this.context_id = context_id;
if (pending_cancel != null) {
Protocol.invokeLater(pending_cancel);
@@ -341,12 +344,13 @@ class TCFSelfTest {
@SuppressWarnings("unchecked")
public void doneGetSymbol(IToken token, Throwable error, ISymbol symbol) {
- assert active_tests.get(this) != null;
- assert this.context_id != null;
if (error != null) {
exit(error);
+ return;
}
- else if (!symbol.isGlobal()) {
+ assert active_tests.get(this) != null;
+ assert this.context_id != null;
+ if (!symbol.isGlobal()) {
exit(new Exception("Symbols 'tcf_test_*' must be global"));
}
else if (!symbol.isAbs()) {
@@ -402,7 +406,7 @@ class TCFSelfTest {
}
public void doneGetContext(IToken token, Exception error, RunControlContext context) {
- if (canceled) return;
+ if (cancel) return;
if (error != null) {
exit(error);
}
@@ -424,7 +428,7 @@ class TCFSelfTest {
}
public void doneGetChildren(IToken token, Exception error, String[] contexts) {
- if (canceled) return;
+ if (cancel) return;
if (error != null) {
exit(error);
}
@@ -437,7 +441,7 @@ class TCFSelfTest {
boolean suspended, String pc, String reason,
Map<String, Object> params) {
final String id = get_state_cmds.remove(token);
- if (canceled) return;
+ if (cancel) return;
if (id == null) {
exit(new Exception("Invalid getState responce"));
}
@@ -522,7 +526,7 @@ class TCFSelfTest {
exit(new Exception("Invalid contextAdded event"));
return;
}
- if (context.getID().equals(contexts[i].getProperties().get("ParentID"))) {
+ if (context.getID().equals(contexts[i].getProperties().get(IRunControl.PROP_PROCESS_ID))) {
threads.put(contexts[i].getID(), contexts[i]);
running.add(contexts[i].getID());
}
@@ -534,7 +538,7 @@ class TCFSelfTest {
if (contexts[i].getID().equals(context.getID())) {
context = contexts[i];
}
- if (context.getID().equals(contexts[i].getProperties().get("ProcessID"))) {
+ if (context.getID().equals(contexts[i].getProperties().get(IRunControl.PROP_PROCESS_ID))) {
threads.put(contexts[i].getID(), contexts[i]);
}
}
@@ -547,7 +551,7 @@ class TCFSelfTest {
}
public void contextRemoved(String[] contexts) {
- for (String id : contexts) {
+ for (String id : contexts) {
if (suspended.get(id) != null) {
exit(new Exception("Invalid contextRemoved event"));
return;
@@ -663,7 +667,7 @@ class TCFSelfTest {
sc.resumed = true;
ctx.resume(IRunControl.RM_RESUME, 1, new IRunControl.DoneCommand() {
public void doneCommand(IToken token, Exception error) {
- if (canceled) return;
+ if (cancel) return;
if (active_tests.get(this) == null) return;
if (threads.get(sc.id) == null) return;
if (error != null) exit(error);
@@ -687,8 +691,8 @@ class TCFSelfTest {
if (!context_id.equals(mem_ctx.getID())) {
exit(new Exception("Bad memory context data: invalid ID"));
}
- Object pid = context.getProperties().get("ProcessID");
- if (pid != null && !pid.equals(mem_ctx.getProperties().get("ProcessID"))) {
+ Object pid = context.getProperties().get(IRunControl.PROP_PROCESS_ID);
+ if (pid != null && !pid.equals(mem_ctx.getProperties().get(IMemory.PROP_PROCESS_ID))) {
exit(new Exception("Bad memory context data: invalid ProcessID"));
}
final boolean big_endian = mem_ctx.isBigEndian();
@@ -869,20 +873,25 @@ class TCFSelfTest {
pending_cancel = done;
}
}
- else {
- diag.cancelTest(context_id, new IDiagnostics.DoneCancelTest() {
+ else if (cancel_test_cmd == null) {
+ cancel_test_cmd = diag.cancelTest(context_id, new IDiagnostics.DoneCancelTest() {
public void doneCancelTest(IToken token, Throwable error) {
+ cancel_test_cmd = null;
exit(error);
done.run();
}
});
}
+ else {
+ exit(new Exception("Cannot terminate remote test process"));
+ done.run();
+ }
}
private void exit(Throwable x) {
if (active_tests.get(this) == null) return;
if (pending_cancel != null) {
- pending_cancel.run();
+ Protocol.invokeLater(pending_cancel);
pending_cancel = null;
}
else {
@@ -1192,7 +1201,7 @@ class TCFSelfTest {
private void runNextTest() {
while (active_tests.isEmpty()) {
- if (canceled || errors.size() > 0 || pending_tests.size() == 0) {
+ if (cancel || errors.size() > 0 || pending_tests.size() == 0) {
for (IChannel channel : channels) {
if (channel != null && channel.getState() != IChannel.STATE_CLOSED) {
if (errors.isEmpty()) channel.close();
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildren.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildren.java
index fafd5e541..6cc6828a8 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildren.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildren.java
@@ -17,7 +17,6 @@ public class TCFChildren {
final TCFNode node;
final Map<String,TCFNode> children = new HashMap<String,TCFNode>();
- final Map<String,TCFNode> children_next = new HashMap<String,TCFNode>();
protected boolean valid;
@@ -26,8 +25,8 @@ public class TCFChildren {
}
void dispose() {
- TCFNode arr[] = children.values().toArray(new TCFNode[children.size()]);
- for (int i = 0; i < arr.length; i++) arr[i].dispose();
+ TCFNode a[] = children.values().toArray(new TCFNode[children.size()]);
+ for (int i = 0; i < a.length; i++) a[i].dispose();
assert children.isEmpty();
}
@@ -35,31 +34,30 @@ public class TCFChildren {
children.remove(id);
}
- void doneValidate() {
+ void doneValidate(Map<String,TCFNode> new_children) {
+ assert !node.disposed;
+ assert !valid;
valid = true;
- TCFNode[] a = children.values().toArray(new TCFNode[children.size()]);
- for (TCFNode n : a) {
- if (children_next.get(n.id) != n) n.dispose();
+ if (children.size() > 0) {
+ TCFNode[] a = children.values().toArray(new TCFNode[children.size()]);
+ for (TCFNode n : a) if (new_children.get(n.id) != n) n.dispose();
}
- for (TCFNode n : children_next.values()) {
- if (children.get(n.id) == null) {
- children.put(n.id, n);
- n.model.addNode(n.id, n);
- }
- assert children.get(n.id) == n;
+ for (TCFNode n : new_children.values()) {
+ assert n.parent == node;
+ children.put(n.id, n);
}
- assert children.size() == children_next.size();
+ assert children.size() == new_children.size();
}
- boolean validate(TCFRunnable done) {
- doneValidate();
+ boolean validate() {
+ doneValidate(new HashMap<String,TCFNode>());
return true;
}
void invalidate() {
- children_next.clear();
+ assert !node.disposed;
TCFNode[] a = children.values().toArray(new TCFNode[children.size()]);
- for (int i = 0; i < a.length; i++) a[i].invalidateNode(TCFNode.CF_ALL);
+ for (int i = 0; i < a.length; i++) a[i].invalidateNode();
valid = false;
}
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenExecContext.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenExecContext.java
index 95229f778..51ca5a64b 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenExecContext.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenExecContext.java
@@ -10,88 +10,189 @@
*******************************************************************************/
package com.windriver.debug.tcf.ui.model;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
+
import com.windriver.tcf.api.protocol.IToken;
import com.windriver.tcf.api.services.IMemory;
import com.windriver.tcf.api.services.IRunControl;
+/**
+ * This class is used to maintain a dynamic list of both executable contexts and memory spaces
+ * that are children of a given parent context. The job is slightly complicated by necessity
+ * to merge results from two independent services.
+ */
+@SuppressWarnings("serial")
public class TCFChildrenExecContext extends TCFChildren {
- private boolean mem_valid;
- private boolean run_valid;
+ private Map<String,TCFNode> mem_children;
+ private Map<String,TCFNode> run_children;
+
+ // Track disposed IDs to detect violations of the communication protocol
+ private LinkedHashMap<String,String> disposed_ids = new LinkedHashMap<String,String>() {
+ protected boolean removeEldestEntry(Map.Entry<String,String> eldest) {
+ return size() > 128;
+ }
+ };
TCFChildrenExecContext(TCFNode node) {
super(node);
}
@Override
- boolean validate(TCFRunnable done) {
- if (!mem_valid && !validateMemoryChildren(done)) return false;
- if (!run_valid && !validateRunControlChildren(done)) return false;
- doneValidate();
+ void dispose() {
+ HashSet<TCFNode> s = new HashSet<TCFNode>();
+ s.addAll(children.values());
+ if (mem_children != null) s.addAll(mem_children.values());
+ if (run_children != null) s.addAll(run_children.values());
+ for (TCFNode n : s) n.dispose();
+ mem_children = null;
+ run_children = null;
+ }
+
+ @Override
+ void dispose(String id) {
+ super.dispose(id);
+ if (mem_children != null) mem_children.remove(id);
+ if (run_children != null) run_children.remove(id);
+ disposed_ids.put(id, id);
+ }
+
+ @Override
+ boolean validate() {
+ assert !node.disposed;
+ Map<String,TCFNode> new_children = new HashMap<String,TCFNode>();
+ if (!validateMemoryChildren(new_children)) return false;
+ if (!validateRunControlChildren(new_children)) return false;
+ doneValidate(new_children);
return true;
}
@Override
void invalidate() {
- mem_valid = false;
- run_valid = false;
- super.invalidate();
+ HashSet<TCFNode> s = new HashSet<TCFNode>();
+ s.addAll(children.values());
+ if (mem_children != null) s.addAll(mem_children.values());
+ if (run_children != null) s.addAll(run_children.values());
+ for (TCFNode n : s) n.invalidateNode();
+ mem_children = null;
+ run_children = null;
+ valid = false;
}
- private boolean validateMemoryChildren(TCFRunnable done) {
- assert node.data_command == null;
+ void onContextAdded(IRunControl.RunControlContext context) {
+ assert !node.disposed;
+ if (run_children != null) {
+ String id = context.getID();
+ TCFNodeExecContext n = (TCFNodeExecContext)node.model.getNode(id);
+ if (n == null) {
+ n = new TCFNodeExecContext(node, id);
+ n.setRunContext(context);
+ n.makeModelDelta(IModelDelta.INSERTED);
+ }
+ else {
+ n.setRunContext(context);
+ n.makeModelDelta(IModelDelta.STATE);
+ }
+ children.put(id, n);
+ run_children.put(id, n);
+ }
+ else {
+ node.invalidateNode();
+ node.makeModelDelta(IModelDelta.CONTENT);
+ }
+ }
+
+ void onContextAdded(IMemory.MemoryContext context) {
+ assert !node.disposed;
+ if (mem_children != null) {
+ String id = context.getID();
+ TCFNodeExecContext n = (TCFNodeExecContext)node.model.getNode(id);
+ if (n == null) {
+ n = new TCFNodeExecContext(node, id);
+ n.setMemoryContext(context);
+ n.makeModelDelta(IModelDelta.INSERTED);
+ }
+ else {
+ n.setMemoryContext(context);
+ n.makeModelDelta(IModelDelta.STATE);
+ }
+ children.put(id, n);
+ mem_children.put(id, n);
+ }
+ else {
+ node.invalidateNode();
+ node.makeModelDelta(IModelDelta.CONTENT);
+ }
+ }
+
+ private boolean validateMemoryChildren(final Map<String,TCFNode> new_children) {
+ if (mem_children != null) {
+ new_children.putAll(mem_children);
+ return true;
+ }
IMemory mem = node.model.getLaunch().getService(IMemory.class);
if (mem == null) {
- mem_valid = true;
+ mem_children = new HashMap<String,TCFNode>();
return true;
}
- if (done != null) node.wait_list.add(done);
- node.data_command = mem.getChildren(node.id, new IMemory.DoneGetChildren() {
+ assert node.pending_command == null;
+ node.pending_command = mem.getChildren(node.id, new IMemory.DoneGetChildren() {
public void doneGetChildren(IToken token, Exception error, String[] contexts) {
- if (node.data_command != token) return;
- node.data_command = null;
+ if (node.pending_command != token) return;
+ node.pending_command = null;
+ mem_children = new_children;
+ mem_children.clear();
if (error != null) {
node.node_error = error;
}
else {
- for (int i = 0; i < contexts.length; i++) {
- String id = contexts[i];
+ for (String id : contexts) {
+ assert disposed_ids.get(id) == null;
TCFNode n = node.model.getNode(id);
if (n == null) n = new TCFNodeExecContext(node, id);
- children_next.put(id, n);
+ mem_children.put(id, n);
}
}
- mem_valid = true;
- node.validateNode(null);
+ node.validateNode();
}
});
return false;
}
- private boolean validateRunControlChildren(TCFRunnable done) {
- assert node.data_command == null;
+ private boolean validateRunControlChildren(final Map<String,TCFNode> new_children) {
+ if (run_children != null) {
+ new_children.putAll(run_children);
+ return true;
+ }
IRunControl run = node.model.getLaunch().getService(IRunControl.class);
if (run == null) {
- run_valid = true;
+ run_children = new HashMap<String,TCFNode>();
return true;
}
- if (done != null) node.wait_list.add(done);
- node.data_command = run.getChildren(node.id, new IRunControl.DoneGetChildren() {
+ assert node.pending_command == null;
+ node.pending_command = run.getChildren(node.id, new IRunControl.DoneGetChildren() {
public void doneGetChildren(IToken token, Exception error, String[] contexts) {
- if (node.data_command != token) return;
- node.data_command = null;
+ if (node.pending_command != token) return;
+ node.pending_command = null;
+ run_children = new_children;
+ run_children.clear();
if (error != null) {
node.node_error = error;
}
else {
for (String id : contexts) {
+ assert disposed_ids.get(id) == null;
TCFNode n = node.model.getNode(id);
if (n == null) n = new TCFNodeExecContext(node, id);
- children_next.put(id, n);
+ run_children.put(id, n);
}
}
- run_valid = true;
- node.validateNode(null);
+ node.validateNode();
}
});
return false;
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenRegisters.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenRegisters.java
index ec76afab7..dcf374fb5 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenRegisters.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenRegisters.java
@@ -10,34 +10,48 @@
*******************************************************************************/
package com.windriver.debug.tcf.ui.model;
+import java.util.HashMap;
+import java.util.Map;
+
import com.windriver.tcf.api.protocol.IToken;
import com.windriver.tcf.api.services.IRegisters;
public class TCFChildrenRegisters extends TCFChildren {
+ private boolean running;
+
TCFChildrenRegisters(TCFNode node) {
super(node);
}
+ /**
+ * Invalidate register values only, keep cached register attributes.
+ */
+ void onSuspended() {
+ if (running || node.node_error != null) invalidate();
+ for (TCFNode n : children.values()) ((TCFNodeRegister)n).onSuspended();
+ }
+
@Override
- boolean validate(TCFRunnable done) {
- children_next.clear();
- String addr = node.getAddress();
- if (addr == null) {
- doneValidate();
+ boolean validate() {
+ assert !node.disposed;
+ assert !valid;
+ final Map<String,TCFNode> new_children = new HashMap<String,TCFNode>();
+ running = !node.isSuspended();
+ if (running) {
+ valid = true;
return true;
}
IRegisters regs = node.model.getLaunch().getService(IRegisters.class);
if (regs == null) {
- doneValidate();
+ doneValidate(new_children);
return true;
}
- assert node.data_command == null;
- if (done != null) node.wait_list.add(done);
- node.data_command = regs.getChildren(node.id, new IRegisters.DoneGetChildren() {
+ assert node.pending_command == null;
+ node.pending_command = regs.getChildren(node.id, new IRegisters.DoneGetChildren() {
public void doneGetChildren(IToken token, Exception error, String[] contexts) {
- if (node.data_command != token) return;
- node.data_command = null;
+ if (node.pending_command != token) return;
+ node.pending_command = null;
if (error != null) {
node.node_error = error;
}
@@ -45,11 +59,11 @@ public class TCFChildrenRegisters extends TCFChildren {
for (String id : contexts) {
TCFNode n = node.model.getNode(id);
if (n == null) n = new TCFNodeRegister(node, id);
- children_next.put(id, n);
+ new_children.put(id, n);
}
}
- doneValidate();
- node.validateNode(null);
+ doneValidate(new_children);
+ node.validateNode();
}
});
return false;
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java
index 8bcf2e757..9d3dae027 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFChildrenStackTrace.java
@@ -10,59 +10,103 @@
*******************************************************************************/
package com.windriver.debug.tcf.ui.model;
+import java.util.HashMap;
+import java.util.Map;
+
import com.windriver.tcf.api.protocol.IToken;
import com.windriver.tcf.api.services.IStackTrace;
public class TCFChildrenStackTrace extends TCFChildren {
- private final TCFChildren children_regs;
+ private final TCFChildrenRegisters children_regs;
+
+ private final Map<String,TCFNodeStackFrame> frames_cache =
+ new HashMap<String,TCFNodeStackFrame>();
- TCFChildrenStackTrace(TCFNode node, TCFChildren children_regs) {
+ TCFChildrenStackTrace(TCFNode node, TCFChildrenRegisters children_regs) {
super(node);
this.children_regs = children_regs;
}
@Override
- boolean validate(TCFRunnable done) {
- children_next.clear();
- String addr = node.getAddress();
- if (addr == null) {
- doneValidate();
+ void dispose() {
+ TCFNode arr[] = frames_cache.values().toArray(new TCFNode[frames_cache.size()]);
+ for (int i = 0; i < arr.length; i++) arr[i].dispose();
+ assert frames_cache.isEmpty();
+ assert children.isEmpty();
+ }
+
+ @Override
+ void dispose(String id) {
+ super.dispose(id);
+ frames_cache.remove(id);
+ }
+
+ void onSourceMappingChange() {
+ for (TCFNodeStackFrame n : frames_cache.values()) n.onSourceMappingChange();
+ }
+
+ void onSuspended() {
+ for (TCFNodeStackFrame n : frames_cache.values()) n.onSuspended();
+ valid = false;
+ }
+
+ void onResumed() {
+ valid = false;
+ }
+
+ @Override
+ boolean validate() {
+ final Map<String,TCFNode> new_children = new HashMap<String,TCFNode>();
+ if (!node.isSuspended()) {
+ doneValidate(new_children);
return true;
}
String nm = node.id + "-TF";
- TCFNode n = children.get(nm);
+ TCFNodeStackFrame n = frames_cache.get(nm);
+ if (n == null) n = (TCFNodeStackFrame)node.model.getNode(nm);
if (n == null) n = new TCFNodeStackFrame(node, nm, children_regs);
- children_next.put(n.id, n);
+ new_children.put(n.id, n);
+ frames_cache.put(n.id, n);
IStackTrace st = node.model.getLaunch().getService(IStackTrace.class);
if (st == null) {
- doneValidate();
+ doneValidate(new_children);
return true;
}
- assert node.data_command == null;
- if (done != null) node.wait_list.add(done);
- node.data_command = st.getChildren(node.id, new IStackTrace.DoneGetChildren() {
+ assert node.pending_command == null;
+ node.pending_command = st.getChildren(node.id, new IStackTrace.DoneGetChildren() {
public void doneGetChildren(IToken token, Exception error, String[] contexts) {
- if (node.data_command != token) return;
- node.data_command = null;
+ if (node.pending_command != token) return;
+ node.pending_command = null;
if (error != null) {
node.node_error = error;
}
else {
int cnt = contexts.length;
for (String id : contexts) {
- TCFNode n = node.model.getNode(id);
- if (n == null || ((TCFNodeStackFrame)n).getFrameNo() != cnt) {
+ TCFNodeStackFrame n = frames_cache.get(id);
+ if (n == null) n = (TCFNodeStackFrame)node.model.getNode(id);
+ if (n == null || n.getFrameNo() != cnt) {
+ if (n != null) n.dispose();
n = new TCFNodeStackFrame(node, id, cnt);
}
- assert ((TCFNodeStackFrame)n).getFrameNo() == cnt;
+ assert n.getFrameNo() == cnt;
assert n.id.equals(id);
- children_next.put(id, n);
+ assert n.parent == node;
+ new_children.put(id, n);
+ frames_cache.put(id, n);
cnt--;
}
+ if (frames_cache.size() > new_children.size() + 32) {
+ // Trim frame cache
+ TCFNode arr[] = frames_cache.values().toArray(new TCFNode[frames_cache.size()]);
+ for (int i = 0; i < arr.length; i++) {
+ if (new_children.get(arr[i].id) == null) arr[i].dispose();
+ }
+ }
}
- doneValidate();
- node.validateNode(null);
+ doneValidate(new_children);
+ node.validateNode();
}
});
return false;
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModel.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModel.java
index f4826d2c3..8982559ff 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModel.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModel.java
@@ -12,6 +12,7 @@ package com.windriver.debug.tcf.ui.model;
import java.util.HashMap;
import java.util.Map;
+import java.util.TreeSet;
import org.eclipse.debug.core.commands.IDisconnectHandler;
import org.eclipse.debug.core.commands.IResumeHandler;
@@ -46,6 +47,7 @@ import com.windriver.debug.tcf.ui.commands.SuspendCommand;
import com.windriver.debug.tcf.ui.commands.TerminateCommand;
import com.windriver.tcf.api.protocol.Protocol;
import com.windriver.tcf.api.services.IMemory;
+import com.windriver.tcf.api.services.IRegisters;
import com.windriver.tcf.api.services.IRunControl;
public class TCFModel implements IElementContentProvider, IElementLabelProvider,
@@ -53,20 +55,83 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
private final Display display;
private final TCFLaunch launch;
- private final TCFNode launch_node;
+ private final TCFNodeLaunch launch_node;
private final Map<IPresentationContext,TCFModelProxy> model_proxies =
new HashMap<IPresentationContext,TCFModelProxy>();
private final Map<String,TCFNode> id2node = new HashMap<String,TCFNode>();
private final Map<TCFNode,ModelDelta> deltas = new HashMap<TCFNode,ModelDelta>();
@SuppressWarnings("unchecked")
private final Map<Class,Object> commands = new HashMap<Class,Object>();
+ private final TreeSet<FutureTask> queue = new TreeSet<FutureTask>();
+
+ private boolean disposed;
+
+ private int future_task_cnt;
+
+ private static class FutureTask implements Comparable<FutureTask>{
+ final int id;
+ final long time;
+ final Runnable run;
+
+ FutureTask(int id, long time, Runnable run) {
+ this.id = id;
+ this.time = time;
+ this.run = run;
+ }
+
+ public int compareTo(FutureTask x) {
+ if (x == this) return 0;
+ if (time < x.time) return -1;
+ if (time > x.time) return +1;
+ if (id < x.id) return -1;
+ if (id > x.id) return +1;
+ assert false;
+ return 0;
+ }
+ }
+
+ private final Thread future_task_dispatcher = new Thread() {
+ public void run() {
+ try {
+ synchronized (queue) {
+ while (!disposed) {
+ if (queue.isEmpty()) {
+ queue.wait();
+ }
+ else {
+ long time = System.currentTimeMillis();
+ FutureTask t = queue.first();
+ if (t.time > time) {
+ queue.wait(t.time - time);
+ }
+ else {
+ queue.remove(t);
+ Protocol.invokeLater(t.run);
+ }
+ }
+ }
+ }
+ }
+ catch (Throwable x) {
+ x.printStackTrace();
+ }
+ }
+ };
private final IMemory.MemoryListener mem_listener = new IMemory.MemoryListener() {
public void contextAdded(IMemory.MemoryContext[] contexts) {
for (int i = 0; i < contexts.length; i++) {
- TCFNode node = getNode(contexts[i].getParentID());
- if (node != null) node.onContextAdded(contexts[i]);
+ String id = contexts[i].getParentID();
+ if (id == null) {
+ launch_node.onContextAdded(contexts[i]);
+ }
+ else {
+ TCFNode node = getNode(id);
+ if (node instanceof TCFNodeExecContext) {
+ ((TCFNodeExecContext)node).onContextAdded(contexts[i]);
+ }
+ }
}
fireModelChanged();
}
@@ -129,8 +194,16 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
public void contextAdded(IRunControl.RunControlContext[] contexts) {
for (int i = 0; i < contexts.length; i++) {
- TCFNode node = getNode(contexts[i].getParentID());
- if (node != null) node.onContextAdded(contexts[i]);
+ String id = contexts[i].getParentID();
+ if (id == null) {
+ launch_node.onContextAdded(contexts[i]);
+ }
+ else {
+ TCFNode node = getNode(id);
+ if (node instanceof TCFNodeExecContext) {
+ ((TCFNodeExecContext)node).onContextAdded(contexts[i]);
+ }
+ }
}
fireModelChanged();
}
@@ -180,6 +253,26 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
}
};
+ private final IRegisters.RegistersListener reg_listener = new IRegisters.RegistersListener() {
+
+ public void contextChanged() {
+ for (TCFNode node : id2node.values()) {
+ if (node instanceof TCFNodeExecContext) {
+ ((TCFNodeExecContext)node).onRegistersChanged();
+ }
+ }
+ fireModelChanged();
+ }
+
+ public void registerChanged(String context) {
+ TCFNode node = getNode(context);
+ if (node instanceof TCFNodeRegister) {
+ ((TCFNodeRegister)node).onValueChanged();
+ }
+ fireModelChanged();
+ }
+ };
+
TCFModel(Display display, TCFLaunch launch) {
this.display = display;
this.launch = launch;
@@ -191,6 +284,8 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
commands.put(IStepIntoHandler.class, new StepIntoCommand(this));
commands.put(IStepOverHandler.class, new StepOverCommand(this));
commands.put(IStepReturnHandler.class, new StepReturnCommand(this));
+ future_task_dispatcher.setName("TCF Future Task Dispatcher");
+ future_task_dispatcher.start();
}
@SuppressWarnings("unchecked")
@@ -206,6 +301,8 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
if (mem != null) mem.addListener(mem_listener);
IRunControl run = launch.getService(IRunControl.class);
if (run != null) run.addListener(run_listener);
+ IRegisters reg = launch.getService(IRegisters.class);
+ if (reg != null) reg.addListener(reg_listener);
launch_node.invalidateNode();
launch_node.makeModelDelta(IModelDelta.STATE | IModelDelta.CONTENT);
fireModelChanged();
@@ -236,13 +333,23 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
}
});
}
-
+
void launchChanged() {
launch_node.makeModelDelta(IModelDelta.STATE | IModelDelta.CONTENT);
fireModelChanged();
}
void dispose() {
+ synchronized (queue) {
+ disposed = true;
+ queue.notify();
+ }
+ try {
+ future_task_dispatcher.join();
+ }
+ catch (InterruptedException e) {
+ e.printStackTrace();
+ }
}
void addNode(String id, TCFNode node) {
@@ -278,7 +385,7 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
for (TCFModelProxy p : model_proxies.values()) p.fireModelChanged(top);
}
}
-
+
public Display getDisplay() {
return display;
}
@@ -298,6 +405,13 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider,
return id2node.get(id);
}
+ public void invokeLater(long delay, Runnable run) {
+ synchronized (queue) {
+ queue.add(new FutureTask(future_task_cnt++, System.currentTimeMillis() + delay, run));
+ queue.notify();
+ }
+ }
+
public void update(IChildrenCountUpdate[] updates) {
for (int i = 0; i < updates.length; i++) {
Object o = updates[i].getElement();
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModelPresentation.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModelPresentation.java
index 07e358631..98efc2471 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModelPresentation.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFModelPresentation.java
@@ -100,6 +100,10 @@ public class TCFModelPresentation implements IDebugModelPresentation {
public void breakpointStatusChanged(String id) {
refreshBreakpointView();
}
+
+ public void breakpointRemoved(String id) {
+ refreshBreakpointView();
+ }
};
public TCFModelPresentation() {
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNode.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNode.java
index c213e0c2d..fb63dcfe5 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNode.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNode.java
@@ -48,7 +48,7 @@ import com.windriver.tcf.api.services.IRunControl;
/**
* TCFNode is base class for all TCF debug model elements.
*/
-public class TCFNode extends PlatformObject
+public abstract class TCFNode extends PlatformObject
implements IMemoryBlockRetrievalExtension, Comparable<TCFNode> {
protected final String id;
@@ -57,25 +57,37 @@ implements IMemoryBlockRetrievalExtension, Comparable<TCFNode> {
protected boolean disposed;
+ /**
+ * Constructor for a root node. There should be exactly one root in the model.
+ * @param model
+ */
+ protected TCFNode(TCFModel model) {
+ id = null;
+ parent = null;
+ this.model = model;
+ }
+
+ /**
+ * Constructor for a node other then root. Node ID must be unique.
+ * @param parent - parent node.
+ * @param id - node ID.
+ */
protected TCFNode(TCFNode parent, String id) {
assert Protocol.isDispatchThread();
this.parent = parent;
this.id = id;
model = parent.model;
- }
-
- protected TCFNode(TCFModel model) {
- id = null;
- parent = null;
- this.model = model;
+ model.addNode(id, this);
}
/**
* Dispose this node. The node is removed from the model.
+ * Subclasses should override the method to dispose children nodes, if any.
*/
void dispose() {
assert !disposed;
if (parent != null) parent.dispose(id);
+ invalidateNode();
model.removeNode(id);
disposed = true;
}
@@ -83,6 +95,9 @@ implements IMemoryBlockRetrievalExtension, Comparable<TCFNode> {
/**
* A child node is being disposed.
* The child should be removed from this node children lists.
+ * Base node class does not support any children, so the method is empty.
+ * Subclasses should override the method if they can have children.
+ * @param id - ID of a node being disposed.
*/
void dispose(String id) {
}
@@ -205,7 +220,7 @@ implements IMemoryBlockRetrievalExtension, Comparable<TCFNode> {
if (!disposed) {
if (!validateNode(this)) return;
if (node_error != null) {
- result.setBackground(new RGB(255, 0, 0), 0);
+ result.setForeground(new RGB(255, 0, 0), 0);
result.setLabel(node_error.getClass().getName() +
": " + node_error.getMessage(), 0);
}
@@ -214,7 +229,7 @@ implements IMemoryBlockRetrievalExtension, Comparable<TCFNode> {
}
}
else {
- result.setLabel("[Disposed]", 0);
+ result.setLabel("...", 0);
}
result.setStatus(Status.OK_STATUS);
done();
@@ -268,23 +283,13 @@ implements IMemoryBlockRetrievalExtension, Comparable<TCFNode> {
/**
* Create ModelDelta for changes in this node.
- * @param flags - description of what has changed: CF_CONTEXT, CF_CHILDREN or CF_ALL.
+ * @param flags - description of what has changed: IModelDelta.ADDED, IModelDelta.REMOVED, etc.
* @return - ModelDelta that describes node changes.
*/
ModelDelta makeModelDelta(int flags) {
int count = -1;
- //if (node_valid == CF_ALL) count = children.size();
- ModelDelta delta = model.getDelta(this);
int index = -1;
- /*
- if (parent.node_valid == CF_ALL) {
- index = 0;
- for (Iterator<TCFNode> i = parent.children.values().iterator(); i.hasNext();) {
- if (i.next() == this) break;
- index++;
- }
- }
- */
+ ModelDelta delta = model.getDelta(this);
if (delta == null || delta.getChildCount() != count || delta.getIndex() != index) {
ModelDelta parent_delta = parent.makeModelDelta(IModelDelta.NO_CHANGE);
delta = parent_delta.addNode(this, index, flags, count);
@@ -296,105 +301,147 @@ implements IMemoryBlockRetrievalExtension, Comparable<TCFNode> {
return delta;
}
- void onContextAdded(IRunControl.RunControlContext context) {
- assert !disposed;
- // TODO: Bug in Eclipse: IModelDelta.INSERTED fails if this is root node
- invalidateNode(CF_CHILDREN);
- makeModelDelta(IModelDelta.CONTENT);
- }
-
- void onContextAdded(IMemory.MemoryContext context) {
- assert !disposed;
- // TODO: Bug in Eclipse: IModelDelta.INSERTED fails if this is root node
- invalidateNode(CF_CHILDREN);
- makeModelDelta(IModelDelta.CONTENT);
- }
-
/*--------------------------------------------------------------------------------------*/
/* Node data retrieval state machine */
- protected static final int
- CF_CHILDREN = 0x0001,
- CF_CONTEXT = 0x0002,
- CF_ALL = CF_CHILDREN | CF_CONTEXT;
-
- protected int node_valid;
protected Throwable node_error;
- protected IToken data_command;
- protected final Collection<TCFRunnable> wait_list = new ArrayList<TCFRunnable>();
+ protected IToken pending_command;
+ private final Collection<TCFRunnable> wait_list = new ArrayList<TCFRunnable>();
/**
* Invalidate the node - flush all cached data.
+ * Subclasses should override this method to flush any additional data.
+ * Subclasses should call super.invalidateNode().
*/
public void invalidateNode() {
- invalidateNode(CF_ALL);
- }
-
- protected void invalidateNode(int flags) {
- // flags - set of CF_*
-
// cancel current data retrieval command
- if (data_command != null) {
- data_command.cancel();
- data_command = null;
+ if (pending_command != null) {
+ pending_command.cancel();
+ pending_command = null;
}
// cancel waiting monitors
if (!wait_list.isEmpty()) {
- TCFRunnable[] arr = wait_list.toArray(new TCFRunnable[wait_list.size()]);
- for (TCFRunnable r : arr) r.cancel();
+ for (TCFRunnable r : wait_list) r.cancel();
wait_list.clear();
}
- if (flags == CF_ALL) {
- node_error = null;
- }
-
- node_valid &= ~flags;
+ node_error = null;
}
/**
* Validate node - retrieve and put into a cache missing data from remote peer.
- * Validation is done asynchronously.
- * @param done - call back, it is called when validation is done.
- * @return true if the node is valid, false if validation is started.
+ * Validation is done asynchronously. If the node is already valid,
+ * the method should return true. Otherwise, it returns false,
+ * and later, when the node becomes valid, call-backs from 'wait_list' are invoked.
+ * @return true if the node is already valid, false if validation is started.
*/
- public boolean validateNode(TCFRunnable done) {
+ public final boolean validateNode() {
assert Protocol.isDispatchThread();
- assert (node_valid & ~CF_ALL) == 0;
- if (data_command != null) {
- if (done != null) wait_list.add(done);
+ assert !disposed;
+ if (pending_command != null) {
return false;
}
else if (model.getLaunch().getChannel() == null) {
node_error = null;
- node_valid = CF_ALL;
}
- else {
- if ((node_valid & CF_CONTEXT) == 0 && !validateContext(done)) return false;
- if ((node_valid & CF_CHILDREN) == 0 && !validateChildren(done)) return false;
+ else if (node_error == null && !validateNodeData()) {
+ return false;
}
- assert node_valid == CF_ALL;
if (!wait_list.isEmpty()) {
Runnable[] arr = wait_list.toArray(new Runnable[wait_list.size()]);
wait_list.clear();
- for (int i = 0; i < arr.length; i++) arr[i].run();
+ for (Runnable r : arr) r.run();
}
return true;
}
- protected boolean validateContext(TCFRunnable done) {
- node_valid |= CF_CONTEXT;
+ /**
+ * Validate node - retrieve and put into a cache missing data from remote peer.
+ * Validation is done asynchronously. If the node is already valid,
+ * the method should return true. Otherwise, it returns false,
+ * adds 'done' into 'wait_list', and later, when the node becomes valid,
+ * call-backs from 'wait_list' are invoked.
+ * @param done - call-back object to call when node becomes valid.
+ * @return true if the node is already valid, false if validation is started.
+ */
+ public final boolean validateNode(TCFRunnable done) {
+ assert done != null;
+ if (!validateNode()) {
+ wait_list.add(done);
+ return false;
+ }
return true;
}
+
+ private class ValidateNodes extends TCFRunnable {
+
+ int cnt = 0;
+ private IToken command;
+
+ ValidateNodes(Collection<TCFNode> nodes) {
+ for (TCFNode n : nodes) {
+ if (!n.validateNode(this)) cnt++;
+ }
+ if (cnt > 0) {
+ pending_command = command = new IToken() {
+ public boolean cancel() {
+ return false;
+ }
+ };
+ }
+ }
+
+ public void run() {
+ cnt--;
+ assert cnt >= 0;
+ if (cnt != 0) return;
+ if (command != pending_command) return;
+ Protocol.invokeLater(new Runnable() {
+ public void run() {
+ if (command != pending_command) return;
+ pending_command = null;
+ validateNode();
+ }
+ });
+ }
+
+ @Override
+ public void cancel() {
+ run();
+ }
+ }
- protected boolean validateChildren(TCFRunnable done) {
- node_valid |= CF_CHILDREN;
- return true;
+ /**
+ * Subclasses can use this method to validate a collection of nodes.
+ * Validation of multiple nodes is expensive and should be avoided
+ * when possible.
+ *
+ * Validation is performed in background, and call-backs from 'wait_list' are
+ * activated when validation is done.
+ *
+ * @param nodes
+ * @return true if all nodes are already valid, false if validation is started.
+ */
+ protected boolean validateNodes(Collection<TCFNode> nodes) {
+ if (nodes.isEmpty()) return true;
+ if (pending_command != null) return false;
+ return new ValidateNodes(nodes).cnt == 0;
}
+
+ /**
+ * Subclasses should override this method to implement data retrieval that
+ * is specific for this node.
+ *
+ * Data retrieval should be performed in background, and it should call
+ * validateNode() when retrieval is done.
+ *
+ * @return true if the node is already valid, false if data retrieval is started.
+ */
+ protected abstract boolean validateNodeData();
/*--------------------------------------------------------------------------------------*/
- /* Memory Block Retrieval */
+ /* Memory Block Retrieval */
public IMemoryBlockExtension getExtendedMemoryBlock(String addr, Object ctx) throws DebugException {
assert ctx == this;
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeExecContext.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeExecContext.java
index 996391ce0..71a776c1e 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeExecContext.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeExecContext.java
@@ -27,11 +27,11 @@ import com.windriver.tcf.api.services.IMemory;
import com.windriver.tcf.api.services.IRunControl;
public class TCFNodeExecContext extends TCFNode {
-
- private final TCFChildren children_exec;
- private final TCFChildren children_stack;
- private final TCFChildren children_regs;
-
+
+ private final TCFChildrenExecContext children_exec;
+ private final TCFChildrenStackTrace children_stack;
+ private final TCFChildrenRegisters children_regs;
+
private IMemory.MemoryContext mem_context;
private IRunControl.RunControlContext run_context;
@@ -44,11 +44,13 @@ public class TCFNodeExecContext extends TCFNode {
private boolean terminated;
@SuppressWarnings("unused")
private String exception_msg;
-
+
private boolean valid_mem_ctx;
private boolean valid_run_ctx;
private boolean valid_state;
+ private int resumed_cnt;
+
TCFNodeExecContext(TCFNode parent, String id) {
super(parent, id);
children_exec = new TCFChildrenExecContext(this);
@@ -63,7 +65,7 @@ public class TCFNodeExecContext extends TCFNode {
children_regs.dispose();
super.dispose();
}
-
+
@Override
void dispose(String id) {
children_exec.dispose(id);
@@ -71,6 +73,16 @@ public class TCFNodeExecContext extends TCFNode {
children_regs.dispose(id);
}
+ void setRunContext(IRunControl.RunControlContext ctx) {
+ run_context = ctx;
+ valid_run_ctx = true;
+ }
+
+ void setMemoryContext(IMemory.MemoryContext ctx) {
+ mem_context = ctx;
+ valid_mem_ctx = true;
+ }
+
@Override
public IRunControl.RunControlContext getRunContext() {
assert Protocol.isDispatchThread();
@@ -115,7 +127,7 @@ public class TCFNodeExecContext extends TCFNode {
result.setChildCount(children_exec.size());
}
}
-
+
@Override
protected void getData(IChildrenUpdate result) {
int offset = 0;
@@ -139,7 +151,7 @@ public class TCFNodeExecContext extends TCFNode {
offset++;
}
}
-
+
@Override
protected void getData(IHasChildrenUpdate result) {
if (run_context != null && run_context.hasState()) {
@@ -154,7 +166,7 @@ public class TCFNodeExecContext extends TCFNode {
result.setHasChilren(children_exec.size() > 0);
}
}
-
+
@Override
protected void getData(ILabelUpdate result) {
result.setImageDescriptor(getImageDescriptor(getImageName()), 0);
@@ -184,135 +196,130 @@ public class TCFNodeExecContext extends TCFNode {
if (run_context != null && run_context.isContainer()) flags |= IModelDelta.STATE;
return super.makeModelDelta(flags);
}
-
- @Override
+
void onContextAdded(IRunControl.RunControlContext context) {
- assert !disposed;
- if (node_valid == CF_ALL) {
- String id = context.getID();
- TCFNodeExecContext n = (TCFNodeExecContext)children_exec.children.get(id);
- if (n == null) {
- n = new TCFNodeExecContext(this, id);
- n.run_context = context;
- n.valid_run_ctx = true;
- children_exec.children.put(id, n);
- model.addNode(id, n);
- n.makeModelDelta(IModelDelta.INSERTED);
- }
- else {
- n.run_context = context;
- n.makeModelDelta(IModelDelta.STATE);
- }
- }
- else {
- invalidateNode(CF_CHILDREN);
- makeModelDelta(IModelDelta.CONTENT);
- }
+ children_exec.onContextAdded(context);
}
void onContextChanged(IRunControl.RunControlContext context) {
assert !disposed;
+ if (!valid_run_ctx) invalidateNode();
run_context = context;
- invalidateNode(CF_CHILDREN);
+ valid_run_ctx = true;
+ resumed_cnt++;
+ children_stack.onSourceMappingChange();
makeModelDelta(IModelDelta.STATE | IModelDelta.CONTENT);
}
- @Override
void onContextAdded(IMemory.MemoryContext context) {
- assert !disposed;
- if (node_valid == CF_ALL) {
- String id = context.getID();
- TCFNodeExecContext n = (TCFNodeExecContext)children_exec.children.get(id);
- if (n == null) {
- n = new TCFNodeExecContext(this, id);
- n.mem_context = context;
- n.valid_mem_ctx = true;
- children_exec.children.put(id, n);
- model.addNode(id, n);
- n.makeModelDelta(IModelDelta.INSERTED);
- }
- else {
- n.mem_context = context;
- n.makeModelDelta(IModelDelta.STATE);
- }
- }
- else {
- invalidateNode(CF_CHILDREN);
- makeModelDelta(IModelDelta.CONTENT);
- }
+ children_exec.onContextAdded(context);
}
void onContextChanged(IMemory.MemoryContext context) {
assert !disposed;
+ if (!valid_mem_ctx) invalidateNode();
mem_context = context;
- invalidateNode(CF_CHILDREN);
+ valid_mem_ctx = true;
+ resumed_cnt++;
makeModelDelta(IModelDelta.STATE | IModelDelta.CONTENT);
}
void onContextRemoved() {
assert !disposed;
+ resumed_cnt++;
dispose();
- if (parent.node_valid == CF_ALL) {
+ if (parent instanceof TCFNodeExecContext &&
+ ((TCFNodeExecContext)parent).children_exec.valid) {
makeModelDelta(IModelDelta.REMOVED);
}
else {
- parent.invalidateNode(CF_CHILDREN);
+ parent.invalidateNode();
parent.makeModelDelta(IModelDelta.CONTENT);
}
}
void onContainerSuspended() {
assert !disposed;
- if (run_context == null) return;
- if (!run_context.hasState()) return;
- suspended = false;
- running = false;
- valid_state = false;
- invalidateNode(CF_CHILDREN);
- suspended = true;
+ if (valid_run_ctx) {
+ if (run_context == null) return;
+ if (!run_context.hasState()) return;
+ suspended = false;
+ running = false;
+ valid_state = false;
+ super.invalidateNode();
+ children_stack.onSuspended();
+ }
+ else {
+ invalidateNode();
+ }
makeModelDelta(IModelDelta.STATE | IModelDelta.CONTENT);
}
void onContainerResumed() {
assert !disposed;
- if (run_context == null) return;
- if (!run_context.hasState()) return;
- suspended = false;
- running = false;
- valid_state = false;
- invalidateNode(CF_CHILDREN);
- suspended = false;
+ if (valid_run_ctx) {
+ if (run_context == null) return;
+ if (!run_context.hasState()) return;
+ suspended = false;
+ running = false;
+ valid_state = false;
+ super.invalidateNode();
+ children_stack.onResumed();
+ }
+ else {
+ invalidateNode();
+ }
makeModelDelta(IModelDelta.STATE | IModelDelta.CONTENT);
}
void onContextSuspended(String pc, String reason, Map<String,Object> params) {
assert !disposed;
- if (run_context == null) return;
- if (!run_context.hasState()) return;
- invalidateNode(CF_CHILDREN);
- suspended = true;
- suspended_pc = pc;
- suspended_reason = reason;
- suspended_params = params;
- running = false;
- valid_state = true;
+ if (valid_run_ctx) {
+ if (run_context == null) return;
+ if (!run_context.hasState()) return;
+ super.invalidateNode();
+ children_stack.onSuspended();
+ suspended = true;
+ suspended_pc = pc;
+ suspended_reason = reason;
+ suspended_params = params;
+ running = false;
+ valid_state = true;
+ }
+ else {
+ invalidateNode();
+ }
+ resumed_cnt++;
makeModelDelta(IModelDelta.STATE | IModelDelta.CONTENT);
}
void onContextResumed() {
assert !disposed;
- if (run_context == null) return;
- if (!run_context.hasState()) return;
- invalidateNode(CF_CHILDREN);
- exception_msg = null;
- terminated = false;
- suspended = false;
- suspended_pc = null;
- suspended_reason = null;
- suspended_params = null;
- running = true;
- valid_state = true;
+ if (valid_run_ctx) {
+ if (run_context == null) return;
+ if (!run_context.hasState()) return;
+ super.invalidateNode();
+ exception_msg = null;
+ terminated = false;
+ suspended = false;
+ suspended_pc = null;
+ suspended_reason = null;
+ suspended_params = null;
+ running = true;
+ valid_state = true;
+ }
+ else {
+ invalidateNode();
+ }
makeModelDelta(IModelDelta.STATE | IModelDelta.CONTENT);
+ final int cnt = ++resumed_cnt;
+ model.invokeLater(250, new Runnable() {
+ public void run() {
+ if (cnt != resumed_cnt) return;
+ children_stack.onResumed();
+ makeModelDelta(IModelDelta.CONTENT);
+ }
+ });
}
void onContextException(String msg) {
@@ -324,54 +331,54 @@ public class TCFNodeExecContext extends TCFNode {
void onMemoryChanged(Number[] addr, long[] size) {
assert !disposed;
}
-
- @Override
- protected void invalidateNode(int flags) {
- super.invalidateNode(flags);
- if ((flags & CF_CONTEXT) != 0) {
- valid_mem_ctx = false;
- valid_run_ctx = false;
- valid_state = false;
- running = false;
- suspended = false;
- }
- if ((flags & CF_CHILDREN) != 0) {
- children_exec.invalidate();
- children_stack.invalidate();
- children_regs.invalidate();
- }
+
+ void onRegistersChanged() {
+ super.invalidateNode();
+ children_regs.invalidate();
+ makeModelDelta(IModelDelta.CONTENT);
}
-
+
@Override
- protected boolean validateContext(TCFRunnable done) {
- if (!valid_mem_ctx && !validateMemoryContext(done)) return false;
- if (!valid_run_ctx && !validateRunControlContext(done)) return false;
- if (!valid_state && !validateRunControlState(done)) return false;
- node_valid |= CF_CONTEXT;
- return true;
+ public void invalidateNode() {
+ super.invalidateNode();
+ valid_mem_ctx = false;
+ valid_run_ctx = false;
+ valid_state = false;
+ running = false;
+ suspended = false;
+ children_exec.invalidate();
+ children_stack.invalidate();
+ children_regs.invalidate();
}
@Override
- protected boolean validateChildren(TCFRunnable done) {
- if (!children_stack.valid && !children_stack.validate(done)) return false;
- if (!children_regs.valid && !children_regs.validate(done)) return false;
- if (!children_exec.valid && !children_exec.validate(done)) return false;
- node_valid |= CF_CHILDREN;
+ protected boolean validateNodeData() {
+ assert !disposed;
+ if (!valid_mem_ctx && !validateMemoryContext()) return false;
+ if (!valid_run_ctx && !validateRunControlContext()) return false;
+ if (!valid_state && !validateRunControlState()) return false;
+ if (!children_stack.valid && !children_stack.validate()) return false;
+ if (!children_regs.valid && !children_regs.validate()) return false;
+ if (!children_exec.valid && !children_exec.validate()) return false;
+ if (run_context != null && !run_context.hasState()) {
+ // Container need to validate children for hasSuspendedChildren() method
+ // to return valid value.
+ if (!validateNodes(children_exec.children.values())) return false;
+ }
return true;
}
- private boolean validateMemoryContext(TCFRunnable done) {
- assert data_command == null;
+ private boolean validateMemoryContext() {
+ assert pending_command == null;
IMemory mem = model.getLaunch().getService(IMemory.class);
if (mem == null) {
valid_mem_ctx = true;
return true;
}
- if (done != null) wait_list.add(done);
- data_command = mem.getContext(id, new IMemory.DoneGetContext() {
+ pending_command = mem.getContext(id, new IMemory.DoneGetContext() {
public void doneGetContext(IToken token, Exception error, IMemory.MemoryContext context) {
- if (data_command != token) return;
- data_command = null;
+ if (pending_command != token) return;
+ pending_command = null;
if (error != null) {
node_error = error;
}
@@ -379,24 +386,23 @@ public class TCFNodeExecContext extends TCFNode {
mem_context = context;
}
valid_mem_ctx = true;
- validateNode(null);
+ validateNode();
}
});
return false;
}
- private boolean validateRunControlContext(TCFRunnable done) {
- assert data_command == null;
+ private boolean validateRunControlContext() {
+ assert pending_command == null;
IRunControl run = model.getLaunch().getService(IRunControl.class);
if (run == null) {
valid_run_ctx = true;
return true;
}
- if (done != null) wait_list.add(done);
- data_command = run.getContext(id, new IRunControl.DoneGetContext() {
+ pending_command = run.getContext(id, new IRunControl.DoneGetContext() {
public void doneGetContext(IToken token, Exception error, IRunControl.RunControlContext context) {
- if (data_command != token) return;
- data_command = null;
+ if (pending_command != token) return;
+ pending_command = null;
if (error != null) {
node_error = error;
}
@@ -404,14 +410,14 @@ public class TCFNodeExecContext extends TCFNode {
run_context = context;
}
valid_run_ctx = true;
- validateNode(null);
+ validateNode();
}
});
return false;
}
- private boolean validateRunControlState(TCFRunnable done) {
- assert data_command == null;
+ private boolean validateRunControlState() {
+ assert pending_command == null;
if (node_error != null || run_context == null || !run_context.hasState()) {
suspended = false;
suspended_pc = null;
@@ -421,11 +427,10 @@ public class TCFNodeExecContext extends TCFNode {
valid_state = true;
return true;
}
- if (done != null) wait_list.add(done);
- data_command = run_context.getState(new IRunControl.DoneGetState() {
+ pending_command = run_context.getState(new IRunControl.DoneGetState() {
public void doneGetState(IToken token, Exception error, boolean suspend, String pc, String reason, Map<String,Object> params) {
- if (token != data_command) return;
- data_command = null;
+ if (token != pending_command) return;
+ pending_command = null;
if (error != null) {
suspended = false;
suspended_pc = null;
@@ -449,12 +454,12 @@ public class TCFNodeExecContext extends TCFNode {
running = !suspend;
}
valid_state = true;
- validateNode(null);
+ validateNode();
}
});
return false;
}
-
+
private boolean hasSuspendedChildren() {
for (TCFNode n : children_exec.children.values()) {
if (n instanceof TCFNodeExecContext) {
@@ -467,7 +472,7 @@ public class TCFNodeExecContext extends TCFNode {
}
return false;
}
-
+
@Override
protected String getImageName() {
if (run_context != null && run_context.hasState()) {
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeLaunch.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeLaunch.java
index b800e2cbe..d6ad830e9 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeLaunch.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeLaunch.java
@@ -22,10 +22,12 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
import org.eclipse.swt.graphics.RGB;
import com.windriver.debug.tcf.core.model.TCFLaunch;
+import com.windriver.tcf.api.services.IMemory;
+import com.windriver.tcf.api.services.IRunControl;
public class TCFNodeLaunch extends TCFNode {
- private final TCFChildren children;
+ private final TCFChildrenExecContext children;
TCFNodeLaunch(TCFModel model) {
super(model);
@@ -85,10 +87,17 @@ public class TCFNodeLaunch extends TCFNode {
result.setLabel(label, 0);
}
+ void onContextAdded(IRunControl.RunControlContext context) {
+ children.onContextAdded(context);
+ }
+
+ void onContextAdded(IMemory.MemoryContext context) {
+ children.onContextAdded(context);
+ }
+
@Override
ModelDelta makeModelDelta(int flags) {
int count = -1;
- //if (node_valid == CF_ALL) count = children.size();
ModelDelta delta = model.getDelta(this);
if (delta == null) {
delta = new ModelDelta(DebugPlugin.getDefault().getLaunchManager(), IModelDelta.NO_CHANGE);
@@ -103,17 +112,14 @@ public class TCFNodeLaunch extends TCFNode {
}
@Override
- protected void invalidateNode(int flags) {
- super.invalidateNode(flags);
- if ((flags & CF_CHILDREN) != 0) {
- children.invalidate();
- }
+ public void invalidateNode() {
+ super.invalidateNode();
+ children.invalidate();
}
@Override
- protected boolean validateChildren(TCFRunnable done) {
- if (!children.valid && !children.validate(done)) return false;
- node_valid |= CF_CHILDREN;
+ protected boolean validateNodeData() {
+ if (!children.valid && !children.validate()) return false;
return true;
}
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeRegister.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeRegister.java
index 9309c1bd9..6adcb2a69 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeRegister.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeRegister.java
@@ -11,13 +11,14 @@
package com.windriver.debug.tcf.ui.model;
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import com.windriver.tcf.api.protocol.IToken;
import com.windriver.tcf.api.services.IRegisters;
-// TODO: hierarchical registers
+//TODO: hierarchical registers
public class TCFNodeRegister extends TCFNode {
-
+
/**
* Presentation column IDs.
*/
@@ -34,7 +35,7 @@ public class TCFNodeRegister extends TCFNode {
COL_VOLATILE = "Volatile",
COL_FLOAT = "Float",
COL_MNEMONIC = "Menimonic";
-
+
private IRegisters.RegistersContext context;
private String hex_value;
@@ -43,7 +44,7 @@ public class TCFNodeRegister extends TCFNode {
private boolean valid_context;
private boolean valid_hex_value;
private boolean valid_dec_value;
-
+
TCFNodeRegister(TCFNode parent, String id) {
super(parent, id);
}
@@ -78,11 +79,11 @@ public class TCFNodeRegister extends TCFNode {
result.setLabel(id, 0);
}
}
-
+
private String bool(boolean b) {
return b ? "yes" : "no";
}
-
+
private String getMnemonic() {
if (num_value != null) {
IRegisters.NamedValue[] arr = context.getNamedValues();
@@ -102,36 +103,49 @@ public class TCFNodeRegister extends TCFNode {
return "";
}
+ void onValueChanged() {
+ onSuspended();
+ }
+
+ /**
+ * Invalidate register value only, keep cached register attributes.
+ */
+ void onSuspended() {
+ super.invalidateNode();
+ valid_hex_value = false;
+ valid_dec_value = false;
+ hex_value = null;
+ dec_value = null;
+ num_value = null;
+ makeModelDelta(IModelDelta.STATE);
+ }
+
@Override
- protected void invalidateNode(int flags) {
- super.invalidateNode(flags);
- if ((flags & CF_CONTEXT) != 0) {
- valid_context = false;
- valid_hex_value = false;
- valid_dec_value = false;
- hex_value = null;
- dec_value = null;
- num_value = null;
- }
+ public void invalidateNode() {
+ super.invalidateNode();
+ valid_context = false;
+ valid_hex_value = false;
+ valid_dec_value = false;
+ hex_value = null;
+ dec_value = null;
+ num_value = null;
}
@Override
- protected boolean validateContext(TCFRunnable done) {
- if (!valid_context && !validateRegisterContext(done)) return false;
- if (!valid_hex_value && !validateRegisterHexValue(done)) return false;
- if (!valid_dec_value && !validateRegisterDecValue(done)) return false;
- node_valid |= CF_CONTEXT;
+ protected boolean validateNodeData() {
+ if (!valid_context && !validateRegisterContext()) return false;
+ if (!valid_hex_value && !validateRegisterHexValue()) return false;
+ if (!valid_dec_value && !validateRegisterDecValue()) return false;
return true;
}
-
- private boolean validateRegisterContext(TCFRunnable done) {
- assert data_command == null;
+
+ private boolean validateRegisterContext() {
+ assert pending_command == null;
IRegisters regs = model.getLaunch().getService(IRegisters.class);
- if (done != null) wait_list.add(done);
- data_command = regs.getContext(id, new IRegisters.DoneGetContext() {
+ pending_command = regs.getContext(id, new IRegisters.DoneGetContext() {
public void doneGetContext(IToken token, Exception error, IRegisters.RegistersContext context) {
- if (data_command != token) return;
- data_command = null;
+ if (pending_command != token) return;
+ pending_command = null;
if (error != null) {
node_error = error;
}
@@ -139,15 +153,14 @@ public class TCFNodeRegister extends TCFNode {
TCFNodeRegister.this.context = context;
}
valid_context = true;
- validateNode(null);
+ validateNode();
}
});
return false;
}
- private boolean validateRegisterHexValue(TCFRunnable done) {
- assert data_command == null;
- if (done != null) wait_list.add(done);
+ private boolean validateRegisterHexValue() {
+ assert pending_command == null;
String[] fmts = context.getAvailableFormats();
String fmt = null;
for (String s : fmts) {
@@ -157,27 +170,26 @@ public class TCFNodeRegister extends TCFNode {
valid_hex_value = true;
return true;
}
- data_command = context.get(fmt, new IRegisters.DoneGet() {
+ pending_command = context.get(fmt, new IRegisters.DoneGet() {
public void doneGet(IToken token, Exception error, String value) {
- if (data_command != token) return;
- data_command = null;
+ if (pending_command != token) return;
+ pending_command = null;
if (error != null) {
node_error = error;
}
else {
hex_value = value;
+ if (!context.isFloat()) num_value = Long.valueOf(value, 16);
}
valid_hex_value = true;
- if (!context.isFloat()) num_value = Long.valueOf(value, 16);
- validateNode(null);
+ validateNode();
}
});
return false;
}
- private boolean validateRegisterDecValue(TCFRunnable done) {
- assert data_command == null;
- if (done != null) wait_list.add(done);
+ private boolean validateRegisterDecValue() {
+ assert pending_command == null;
String[] fmts = context.getAvailableFormats();
String fmt = null;
for (String s : fmts) {
@@ -187,20 +199,20 @@ public class TCFNodeRegister extends TCFNode {
valid_dec_value = true;
return true;
}
- data_command = context.get(fmt, new IRegisters.DoneGet() {
+ pending_command = context.get(fmt, new IRegisters.DoneGet() {
public void doneGet(IToken token, Exception error, String value) {
- if (data_command != token) return;
- data_command = null;
+ if (pending_command != token) return;
+ pending_command = null;
if (error != null) {
node_error = error;
}
else {
dec_value = value;
+ if (!context.isFloat()) num_value = Long.valueOf(value, 10);
+ else num_value = Double.valueOf(value);
}
valid_dec_value = true;
- if (!context.isFloat()) num_value = Long.valueOf(value, 10);
- else num_value = Double.valueOf(value);
- validateNode(null);
+ validateNode();
}
});
return false;
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeStackFrame.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeStackFrame.java
index 91683da5e..9dee89fec 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeStackFrame.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFNodeStackFrame.java
@@ -11,12 +11,14 @@
package com.windriver.debug.tcf.ui.model;
import java.math.BigInteger;
+import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.debug.ui.IDebugUIConstants;
import com.windriver.tcf.api.protocol.IToken;
@@ -31,11 +33,12 @@ public class TCFNodeStackFrame extends TCFNode {
private IStackTrace.StackTraceContext stack_trace_context;
private ILineNumbers.CodeArea code_area;
+ private BigInteger code_address;
private final int frame_no;
- private final TCFChildren children_regs;
+ private final TCFChildrenRegisters children_regs;
- TCFNodeStackFrame(TCFNode parent, String id, TCFChildren children_regs) {
+ TCFNodeStackFrame(TCFNode parent, String id, TCFChildrenRegisters children_regs) {
super(parent, id);
this.frame_no = 0;
this.children_regs = children_regs;
@@ -46,20 +49,20 @@ public class TCFNodeStackFrame extends TCFNode {
this.frame_no = frame_no;
children_regs = new TCFChildrenRegisters(this);
}
-
+
int getFrameNo() {
return frame_no;
}
@Override
void dispose() {
- children_regs.dispose();
+ if (frame_no != 0) children_regs.dispose();
super.dispose();
}
@Override
void dispose(String id) {
- children_regs.dispose(id);
+ if (frame_no != 0) children_regs.dispose(id);
}
@Override
@@ -87,7 +90,8 @@ public class TCFNodeStackFrame extends TCFNode {
assert Protocol.isDispatchThread();
if (frame_no == 0) return parent.getAddress();
if (stack_trace_context != null) {
- return stack_trace_context.getReturnAddress().toString();
+ Number addr = stack_trace_context.getReturnAddress();
+ if (addr != null) return addr.toString();
}
return null;
}
@@ -101,7 +105,7 @@ public class TCFNodeStackFrame extends TCFNode {
result.setChildCount(0);
}
}
-
+
@Override
protected void getData(IChildrenUpdate result) {
int offset = 0;
@@ -122,7 +126,7 @@ public class TCFNodeStackFrame extends TCFNode {
}
}
}
-
+
@Override
protected void getData(IHasChildrenUpdate result) {
if (IDebugUIConstants.ID_REGISTER_VIEW.equals(result.getPresentationContext().getId())) {
@@ -155,7 +159,7 @@ public class TCFNodeStackFrame extends TCFNode {
}
result.setLabel(label, 0);
}
-
+
private String makeHexAddrString(Number n) {
BigInteger i = null;
if (n instanceof BigInteger) i = (BigInteger)n;
@@ -169,78 +173,101 @@ public class TCFNodeStackFrame extends TCFNode {
return "0x0000000000000000".substring(0, 2 + l) + s;
}
+ void onSourceMappingChange() {
+ super.invalidateNode();
+ code_address = null;
+ code_area = null;
+ makeModelDelta(IModelDelta.STATE);
+ }
+
+ void onSuspended() {
+ super.invalidateNode();
+ stack_trace_context = null;
+ children_regs.onSuspended();
+ makeModelDelta(IModelDelta.STATE);
+ }
+
@Override
- protected void invalidateNode(int flags) {
- super.invalidateNode(flags);
- if ((flags & CF_CHILDREN) != 0) {
- children_regs.invalidate();
- }
+ public void invalidateNode() {
+ super.invalidateNode();
+ stack_trace_context = null;
+ code_address = null;
+ code_area = null;
+ children_regs.invalidate();
}
@Override
- protected boolean validateContext(TCFRunnable done) {
- assert data_command == null;
+ protected boolean validateNodeData() {
+ assert pending_command == null;
+ if (node_error != null) return true;
if (frame_no == 0) {
- node_valid |= CF_CONTEXT;
- return true;
+ if (!children_regs.valid) {
+ assert children_regs.node == parent;
+ // Need to validate parent for children_regs to be valid.
+ ArrayList<TCFNode> nodes = new ArrayList<TCFNode>();
+ nodes.add(parent);
+ if (!validateNodes(nodes)) return false;
+ }
+ return validateSourceMapping();
}
+ if (!children_regs.valid && !children_regs.validate()) return false;
+ if (stack_trace_context != null) return true;
IStackTrace st = model.getLaunch().getService(IStackTrace.class);
- if (done != null) wait_list.add(done);
- data_command = st.getContext(new String[]{ id }, new IStackTrace.DoneGetContext() {
+ pending_command = st.getContext(new String[]{ id }, new IStackTrace.DoneGetContext() {
public void doneGetContext(IToken token, Exception error, IStackTrace.StackTraceContext[] context) {
- if (data_command != token) return;
- data_command = null;
+ if (pending_command != token) return;
+ pending_command = null;
if (error != null) {
node_error = error;
}
else {
stack_trace_context = context[0];
}
- BigInteger n = null;
- ILineNumbers ln = model.getLaunch().getService(ILineNumbers.class);
- if (node_error == null && ln != null) {
- String s = getAddress();
- if (s != null) n = new BigInteger(s);
- }
+ if (!validateSourceMapping()) return;
+ validateNode();
+ }
+ });
+ return false;
+ }
+
+ private boolean validateSourceMapping() {
+ BigInteger n = null;
+ ILineNumbers ln = model.getLaunch().getService(ILineNumbers.class);
+ if (node_error == null && ln != null) {
+ String s = getAddress();
+ if (s != null) n = new BigInteger(s);
+ }
+ if (n != null && n.equals(code_address)) return true;
+ if (n == null) {
+ code_area = null;
+ code_address = null;
+ return true;
+ }
+ final BigInteger n0 = n;
+ final BigInteger n1 = n0.add(BigInteger.valueOf(1));
+ pending_command = ln.mapToSource(parent.id, n0, n1, new ILineNumbers.DoneMapToSource() {
+ public void doneMapToSource(IToken token, Exception error, CodeArea[] areas) {
+ if (pending_command != token) return;
+ pending_command = null;
code_area = null;
- if (n == null) {
- node_valid |= CF_CONTEXT;
- validateNode(null);
+ if (error != null) {
+ node_error = error;
}
- else {
- BigInteger m = n.add(BigInteger.valueOf(1));
- data_command = ln.mapToSource(parent.id, n, m, new ILineNumbers.DoneMapToSource() {
- public void doneMapToSource(IToken token, Exception error, CodeArea[] areas) {
- if (data_command != token) return;
- data_command = null;
- if (error != null) {
- node_error = error;
- }
- else if (areas != null && areas.length > 0) {
- for (ILineNumbers.CodeArea area : areas) {
- if (code_area == null || area.start_line < code_area.start_line) {
- code_area = area;
- }
- }
- }
- node_valid |= CF_CONTEXT;
- validateNode(null);
+ else if (areas != null && areas.length > 0) {
+ for (ILineNumbers.CodeArea area : areas) {
+ if (code_area == null || area.start_line < code_area.start_line) {
+ code_area = area;
}
- });
+ }
}
+ code_address = n0;
+ validateNode();
}
});
return false;
}
@Override
- protected boolean validateChildren(TCFRunnable done) {
- if (!children_regs.valid && !children_regs.validate(done)) return false;
- node_valid |= CF_CHILDREN;
- return true;
- }
-
- @Override
protected String getImageName() {
if (isRunning()) return "icons/full/obj16/stckframe_running_obj.gif";
return "icons/full/obj16/stckframe_obj.gif";
diff --git a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFRunnable.java b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFRunnable.java
index f55cb8afb..0a7cdac63 100644
--- a/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFRunnable.java
+++ b/plugins/com.windriver.debug.tcf.ui/src/com/windriver/debug/tcf/ui/model/TCFRunnable.java
@@ -19,6 +19,13 @@ public abstract class TCFRunnable implements Runnable {
private final IRequest monitor;
private final Display display;
+
+ private boolean canceled;
+
+ public TCFRunnable() {
+ monitor = null;
+ display = null;
+ }
public TCFRunnable(Display display, IRequest monitor) {
this.monitor = monitor;
@@ -27,6 +34,8 @@ public abstract class TCFRunnable implements Runnable {
}
public void cancel() {
+ canceled = true;
+ if (display == null) return;
display.asyncExec(new Runnable() {
public void run() {
monitor.cancel();
@@ -36,10 +45,15 @@ public abstract class TCFRunnable implements Runnable {
}
public void done() {
+ if (display == null) return;
display.asyncExec(new Runnable() {
public void run() {
monitor.done();
}
});
}
+
+ public boolean isCanceled() {
+ return canceled;
+ }
}
diff --git a/plugins/com.windriver.tcf.api/.classpath b/plugins/com.windriver.tcf.api/.classpath
index 751c8f2e5..304e86186 100644
--- a/plugins/com.windriver.tcf.api/.classpath
+++ b/plugins/com.windriver.tcf.api/.classpath
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/plugins/com.windriver.tcf.api/.settings/org.eclipse.jdt.core.prefs b/plugins/com.windriver.tcf.api/.settings/org.eclipse.jdt.core.prefs
index d598b3c83..0bf81e2f5 100644
--- a/plugins/com.windriver.tcf.api/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/com.windriver.tcf.api/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,4 @@
-#Mon Sep 10 12:26:22 PDT 2007
+#Tue Feb 05 15:38:16 CET 2008
eclipse.preferences.version=1
org.eclipse.jdt.core.builder.cleanOutputFolder=clean
org.eclipse.jdt.core.builder.duplicateResourceTask=warning
@@ -8,6 +8,265 @@ org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,.svn/
org.eclipse.jdt.core.circularClasspath=error
org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=8
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/plugins/com.windriver.tcf.api/.settings/org.eclipse.jdt.ui.prefs b/plugins/com.windriver.tcf.api/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 000000000..010494bb8
--- /dev/null
+++ b/plugins/com.windriver.tcf.api/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jan 07 15:38:38 PST 2008
+eclipse.preferences.version=1
+formatter_profile=_Java STD
+formatter_settings_version=11
diff --git a/plugins/com.windriver.tcf.api/META-INF/MANIFEST.MF b/plugins/com.windriver.tcf.api/META-INF/MANIFEST.MF
index 87bb955c3..5ad6ca0e6 100644
--- a/plugins/com.windriver.tcf.api/META-INF/MANIFEST.MF
+++ b/plugins/com.windriver.tcf.api/META-INF/MANIFEST.MF
@@ -1,12 +1,13 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
-Bundle-SymbolicName: com.windriver.tcf.api
-Bundle-Version: 0.1.0
+Bundle-SymbolicName: com.windriver.tcf.api;singleton:=true
+Bundle-Version: 0.2.0
Bundle-Activator: com.windriver.tcf.api.Activator
Bundle-Vendor: %providerName
Require-Bundle: org.eclipse.core.runtime
Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
Eclipse-LazyStart: true
Export-Package: com.windriver.tcf.api.core,
com.windriver.tcf.api.protocol,
diff --git a/plugins/com.windriver.tcf.api/build.properties b/plugins/com.windriver.tcf.api/build.properties
index 34d2e4d2d..cdd2db7f1 100644
--- a/plugins/com.windriver.tcf.api/build.properties
+++ b/plugins/com.windriver.tcf.api/build.properties
@@ -1,4 +1,7 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
- .
+ .,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/plugins/com.windriver.tcf.api/plugin.xml b/plugins/com.windriver.tcf.api/plugin.xml
new file mode 100644
index 000000000..a3ab7c70e
--- /dev/null
+++ b/plugins/com.windriver.tcf.api/plugin.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+
+ <extension-point id="startup" name="TCF Startup" schema="schema/startup.exsd"/>
+
+</plugin>
diff --git a/plugins/com.windriver.debug.tcf.core/schema/startup.exsd b/plugins/com.windriver.tcf.api/schema/startup.exsd
index 0d41bb8d9..8411b714d 100644
--- a/plugins/com.windriver.debug.tcf.core/schema/startup.exsd
+++ b/plugins/com.windriver.tcf.api/schema/startup.exsd
@@ -1,9 +1,9 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
-<schema targetNamespace="com.windriver.debug.tcf">
+<schema targetNamespace="com.windriver.tcf.api">
<annotation>
<appInfo>
- <meta.schema plugin="com.windriver.debug.tcf.core" id="startup" name="TCF Startup"/>
+ <meta.schema plugin="com.windriver.tcf.api" id="startup" name="TCF Startup"/>
</appInfo>
<documentation>
This extension point is used to register plugins
@@ -47,7 +47,7 @@
<attribute name="name" type="string">
<annotation>
<documentation>
- Class will be loaded during statup
+ Class will be loaded and initialized during TCF statup
</documentation>
</annotation>
</attribute>
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/Activator.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/Activator.java
index 97ead437f..24536f4b4 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/Activator.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/Activator.java
@@ -10,9 +10,14 @@
*******************************************************************************/
package com.windriver.tcf.api;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
+import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import com.windriver.tcf.api.protocol.Protocol;
@@ -36,6 +41,7 @@ public class Activator extends Plugin {
public void start(BundleContext context) throws Exception {
super.start(context);
Protocol.setEventQueue(new EventQueue());
+ runTCFStartup();
}
@Override
@@ -44,6 +50,34 @@ public class Activator extends Plugin {
super.stop(context);
}
+ @SuppressWarnings("unchecked")
+ private void runTCFStartup() {
+ try {
+ IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, "startup");
+ IExtension[] extensions = point.getExtensions();
+ for (int i = 0; i < extensions.length; i++) {
+ try {
+ Bundle bundle = Platform.getBundle(extensions[i].getNamespaceIdentifier());
+ bundle.start();
+ IConfigurationElement[] e = extensions[i].getConfigurationElements();
+ for (int j = 0; j < e.length; j++) {
+ String nm = e[j].getName();
+ if (nm.equals("class")) { //$NON-NLS-1$
+ Class c = bundle.loadClass(e[j].getAttribute("name")); //$NON-NLS-1$
+ Class.forName(c.getName(), true, c.getClassLoader());
+ }
+ }
+ }
+ catch (Throwable x) {
+ log("TCF startup error", x);
+ }
+ }
+ }
+ catch (Exception x) {
+ log("TCF startup error", x);
+ }
+ }
+
/**
* Returns the shared instance
*
@@ -64,7 +98,7 @@ public class Activator extends Plugin {
}
else {
plugin.getLog().log(new Status(IStatus.ERROR,
- getDefault().getBundle().getSymbolicName(), IStatus.OK, msg, err));
+ plugin.getBundle().getSymbolicName(), IStatus.OK, msg, err));
}
}
}
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/core/AbstractChannel.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/core/AbstractChannel.java
index 767f8b153..d5315cd6d 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/core/AbstractChannel.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/core/AbstractChannel.java
@@ -14,7 +14,6 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
@@ -114,6 +113,7 @@ public abstract class AbstractChannel implements IChannel {
private final Map<String,Message> out_tokens = new HashMap<String,Message>();
private final Thread inp_thread;
private final Thread out_thread;
+ private boolean notifying_channel_opened;
private boolean shutdown;
private int state = STATE_OPENNING;
private IToken redirect_command;
@@ -127,8 +127,8 @@ public abstract class AbstractChannel implements IChannel {
private Collection<TraceListener> trace_listeners;
public static final int
- EOS = -1,
- EOM = -2;
+ EOS = -1, // End Of Stream
+ EOM = -2; // End Of Message
protected AbstractChannel(IPeer peer) {
assert Protocol.isDispatchThread();
@@ -359,8 +359,7 @@ public abstract class AbstractChannel implements IChannel {
if (state != STATE_OPENNING) throw new IOException("Invalid event: Locator.Hello");
remote_service_by_class.clear();
String pkg_name = LocatorProxy.class.getPackage().getName();
- for (Iterator<String> i = c.iterator(); i.hasNext();) {
- String service_name = i.next();
+ for (String service_name : c) {
try {
Class<?> cls = Class.forName(pkg_name + "." + service_name + "Proxy");
IService service = (IService)cls.getConstructor(IChannel.class).newInstance(this);
@@ -397,15 +396,18 @@ public abstract class AbstractChannel implements IChannel {
}
else {
state = STATE_OPEN;
+ notifying_channel_opened = true;
Transport.channelOpened(this);
- Protocol.invokeLater(new Runnable() {
- public void run() {
- listeners_array = channel_listeners.toArray(listeners_array);
- for (int i = 0; i < listeners_array.length && listeners_array[i] != null; i++) {
- listeners_array[i].onChannelOpened();
- }
+ listeners_array = channel_listeners.toArray(listeners_array);
+ for (int i = 0; i < listeners_array.length && listeners_array[i] != null; i++) {
+ try {
+ listeners_array[i].onChannelOpened();
}
- });
+ catch (Throwable x) {
+ Activator.log("Exception in channel listener", x);
+ }
+ }
+ notifying_channel_opened = false;
}
}
@@ -592,6 +594,13 @@ public abstract class AbstractChannel implements IChannel {
return (V)remote_service_by_class.get(cls);
}
+ public <V extends IService> void setServiceProxy(Class<V> service_interface, IService service_proxy) {
+ if (!notifying_channel_opened) new Error("setServiceProxe() can be called only from channel open call-back");
+ if (!(remote_service_by_name.get(service_proxy.getName()) instanceof GenericProxy)) throw new Error("Proxy already set");
+ if (remote_service_by_class.get(service_interface) != null) throw new Error("Proxy already set");
+ remote_service_by_class.put(service_interface, service_proxy);
+ }
+
public IService getLocalService(String service_name) {
return local_service_by_name.get(service_name);
}
@@ -755,13 +764,17 @@ public abstract class AbstractChannel implements IChannel {
/**
* Read one byte from the channel input stream.
- * @return next data byte or -1 if end of stream is reached.
+ * @return next data byte or EOS (-1) if end of stream is reached,
+ * or EOM (-2) if end of message is reached.
* @throws IOException
*/
protected abstract int read() throws IOException;
/**
* Write one byte into the channel output stream.
+ * The method argument can be one of two special values:
+ * EOS (-1) end of stream marker;
+ * EOM (-2) end of message marker.
* The stream can put the byte into a buffer instead of transmitting it right away.
* @param n - the data byte.
* @throws IOException
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/local/LocatorService.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/local/LocatorService.java
index 9672433ea..8923c28d0 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/local/LocatorService.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/local/LocatorService.java
@@ -151,9 +151,6 @@ public class LocatorService implements ILocator {
Collection<String> c = (Collection<String>)JSON.parseSequence(data)[0];
channel.onLocatorHello(c);
}
- else {
- throw new IOException("Unknown event: Locator." + name);
- }
}
catch (IOException e) {
channel.terminate(e);
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/MemoryProxy.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/MemoryProxy.java
index 19b3e1aa4..1231f96da 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/MemoryProxy.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/MemoryProxy.java
@@ -127,9 +127,7 @@ public class MemoryProxy implements IMemory {
}
public String getParentID() {
- String s = (String)props.get(PROP_PARENT_ID);
- if (s == null) return "";
- return s;
+ return (String)props.get(PROP_PARENT_ID);
}
public int getAddressSize() {
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/ProcessesProxy.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/ProcessesProxy.java
index 4db81a295..0eacb5d28 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/ProcessesProxy.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/ProcessesProxy.java
@@ -151,7 +151,7 @@ public class ProcessesProxy implements IProcesses {
public void done(Exception error, Object[] args) {
ProcessContext ctx = null;
if (error == null) {
- assert args.length == 2;
+ assert args.length == 3;
error = toError(args[0], args[1]);
if (args[2] != null) {
ctx = new ProcessContext((Map<String, Object>)args[2]);
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/RunControlProxy.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/RunControlProxy.java
index 774a5e6ec..7160a9509 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/RunControlProxy.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/RunControlProxy.java
@@ -46,9 +46,7 @@ public class RunControlProxy implements IRunControl {
}
public String getParentID() {
- String s = (String)props.get(PROP_PARENT_ID);
- if (s == null) return "";
- return s;
+ return (String)props.get(PROP_PARENT_ID);
}
public boolean isContainer() {
@@ -148,7 +146,7 @@ public class RunControlProxy implements IRunControl {
}
public void addListener(final RunControlListener listener) {
- IChannel.IEventListener l = new IChannel.IEventListener() {
+ IChannel.IEventListener l = new IChannel.IEventListener() {
@SuppressWarnings("unchecked")
public void event(String name, byte[] data) {
@@ -207,7 +205,7 @@ public class RunControlProxy implements IRunControl {
}
public void removeListener(RunControlListener listener) {
- IChannel.IEventListener l = listeners.remove(listener);
+ IChannel.IEventListener l = listeners.remove(listener);
if (l != null) channel.removeEventListener(this, l);
}
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/StackTraceProxy.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/StackTraceProxy.java
index 5385c5d1f..5945082f1 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/StackTraceProxy.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/internal/services/remote/StackTraceProxy.java
@@ -11,6 +11,7 @@
package com.windriver.tcf.api.internal.services.remote;
import java.util.Collection;
+import java.util.HashMap;
import java.util.Map;
import com.windriver.tcf.api.core.Command;
@@ -19,14 +20,15 @@ import com.windriver.tcf.api.protocol.IToken;
import com.windriver.tcf.api.services.IStackTrace;
public class StackTraceProxy implements IStackTrace {
-
+
private final IChannel channel;
-
+
private class Context implements StackTraceContext {
-
+
private final Map<String,Object> props;
-
+
Context(Map<String,Object> props) {
+ if (props == null) props = new HashMap<String,Object>();
this.props = props;
}
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/protocol/IChannel.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/protocol/IChannel.java
index 4b15660b8..589ead0b4 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/protocol/IChannel.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/protocol/IChannel.java
@@ -181,7 +181,7 @@ public interface IChannel {
*/
void event(String name, byte[] data);
}
-
+
/**
* Subscribe an event listener for given service.
* @param service - remote service proxy
@@ -230,18 +230,29 @@ public interface IChannel {
Collection<String> getRemoteServices();
/**
- * @return an object representing a service from remote peer.
+ * @return an object (proxy) representing a service from remote peer.
* Return null if the service is not available.
+ * Return an instance of GenericProxy if 'service_name' is not a standard TCF service.
*/
IService getRemoteService(String service_name);
/**
- * @return an object representing a service from remote peer.
- * Service object should implement given interface.
+ * @return an object (proxy) representing a service from remote peer,
+ * which implements given interface.
* Return null if implementation of the interface is not available.
*/
<V extends IService> V getRemoteService(Class<V> service_interface);
-
+
+ /**
+ * Install a service proxy object on this channel.
+ * This method can be called only from channel open call-back.
+ * It allows a client to extends TCF by adding proxy objects for non-standard services.
+ * Client, wishing to become service proxy provider, should register itself
+ * using either Protocol.addChannelOpenListener() or IChannel.addChannelListener().
+ * It is not allowed to register more then one proxy for a given service interface.
+ */
+ <V extends IService> void setServiceProxy(Class<V> service_interface, IService service_proxy);
+
/**
* Close communication channel.
*/
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IMemory.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IMemory.java
index 0f01c4a95..ef0b7a5fb 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IMemory.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IMemory.java
@@ -184,11 +184,11 @@ public interface IMemory extends IService {
// Error may have per byte information
final static int
- BYTE_VALID = 0x00,
- BYTE_UNKNOWN = 0x01, // e.g. out of range
- BYTE_INVALID = 0x02,
- BYTE_CANNOT_READ = 0x04,
- BYTE_CANNOT_WRITE = 0x08;
+ BYTE_VALID = 0x00,
+ BYTE_UNKNOWN = 0x01, // e.g. out of range
+ BYTE_INVALID = 0x02,
+ BYTE_CANNOT_READ = 0x04,
+ BYTE_CANNOT_WRITE = 0x08;
int getStatus(int offset);
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IRunControl.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IRunControl.java
index fc8befbcc..65f2d0835 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IRunControl.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/IRunControl.java
@@ -25,6 +25,7 @@ public interface IRunControl extends IService {
static final String
PROP_ID = "ID",
PROP_PARENT_ID = "ParentID",
+ PROP_PROCESS_ID = "ProcessID",
PROP_IS_CONTAINER = "IsContainer",
PROP_HAS_STATE = "HasState",
PROP_CAN_RESUME = "CanResume",
diff --git a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/ISysMonitor.java b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/ISysMonitor.java
index f154c9c0e..bffd8743c 100644
--- a/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/ISysMonitor.java
+++ b/plugins/com.windriver.tcf.api/src/com/windriver/tcf/api/services/ISysMonitor.java
@@ -230,8 +230,8 @@ public interface ISysMonitor extends IService {
/** Scheduling policy */
PROP_POLICY = "Policy";
-
-
+
+
/**
* A context corresponds to an execution thread, process, address space, etc.
* A context can belong to a parent context. Contexts hierarchy can be simple
@@ -242,7 +242,7 @@ public interface ISysMonitor extends IService {
* attributes and functionality, which is relevant to that service.
*/
interface SysMonitorContext {
-
+
/**
* Get context ID.
* Same as getProperties().get(“ID”)
diff --git a/plugins/com.windriver.tcf.dsf.core/.classpath b/plugins/com.windriver.tcf.dsf.core/.classpath
index 751c8f2e5..304e86186 100644
--- a/plugins/com.windriver.tcf.dsf.core/.classpath
+++ b/plugins/com.windriver.tcf.dsf.core/.classpath
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/plugins/com.windriver.tcf.dsf.core/.settings/org.eclipse.jdt.core.prefs b/plugins/com.windriver.tcf.dsf.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..0bf81e2f5
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,272 @@
+#Tue Feb 05 15:38:16 CET 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,.svn/
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=8
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/plugins/com.windriver.tcf.dsf.core/.settings/org.eclipse.jdt.ui.prefs b/plugins/com.windriver.tcf.dsf.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 000000000..abbc7248f
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Wed Jan 09 12:21:30 PST 2008
+eclipse.preferences.version=1
+formatter_profile=_Java STD
+formatter_settings_version=11
diff --git a/plugins/com.windriver.tcf.dsf.core/META-INF/MANIFEST.MF b/plugins/com.windriver.tcf.dsf.core/META-INF/MANIFEST.MF
index 31b80627c..5a0ebf9d3 100644
--- a/plugins/com.windriver.tcf.dsf.core/META-INF/MANIFEST.MF
+++ b/plugins/com.windriver.tcf.dsf.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: com.windriver.tcf.dsf.core;singleton:=true
-Bundle-Version: 0.1.0
+Bundle-Version: 0.2.0
Bundle-Activator: com.windriver.tcf.dsf.core.Activator
Bundle-Vendor: %providerName
Require-Bundle: org.eclipse.core.runtime,
@@ -10,9 +10,11 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.core.resources,
org.eclipse.dd.dsf,
org.eclipse.dd.dsf.debug,
+ org.eclipse.cdt.core,
com.windriver.tcf.api,
com.windriver.debug.tcf.core
Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
Eclipse-LazyStart: true
Export-Package: com.windriver.tcf.dsf.core.launch,
com.windriver.tcf.dsf.core.services
diff --git a/plugins/com.windriver.tcf.dsf.core/build.properties b/plugins/com.windriver.tcf.dsf.core/build.properties
index e9863e281..2b6399957 100644
--- a/plugins/com.windriver.tcf.dsf.core/build.properties
+++ b/plugins/com.windriver.tcf.dsf.core/build.properties
@@ -2,4 +2,7 @@ source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
- plugin.xml
+ plugin.xml,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFExecuter.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFExecuter.java
index 94b3cc18e..c43242ede 100644
--- a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFExecuter.java
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFExecuter.java
@@ -26,9 +26,9 @@ import org.eclipse.dd.dsf.concurrent.DsfExecutor;
import com.windriver.tcf.api.protocol.Protocol;
public class TCFDSFExecuter extends AbstractExecutorService implements DsfExecutor {
-
+
private class ScheduledFutureTask<V> extends FutureTask<V> implements ScheduledFuture<V> {
-
+
private long time; // Milliseconds
private final int id;
private final long period; // Milliseconds
@@ -39,7 +39,7 @@ public class TCFDSFExecuter extends AbstractExecutorService implements DsfExecut
id = sf_count++;
this.period = period;
}
-
+
public ScheduledFutureTask(long delay, Callable<V> callable) {
super(callable);
time = System.currentTimeMillis() + delay;
@@ -79,13 +79,13 @@ public class TCFDSFExecuter extends AbstractExecutorService implements DsfExecut
}
}
}
-
+
private static int sf_count = 0;
private final TreeSet<ScheduledFutureTask<?>> queue = new TreeSet<ScheduledFutureTask<?>>();
private final Thread thread;
private boolean is_shutdown;
private boolean is_terminated;
-
+
public TCFDSFExecuter() {
thread = new Thread(new Runnable() {
public void run() {
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFLaunch.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFLaunch.java
index f9535ce5e..179be870d 100644
--- a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFLaunch.java
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFLaunch.java
@@ -11,23 +11,47 @@
package com.windriver.tcf.dsf.core.launch;
import org.eclipse.dd.dsf.concurrent.DsfExecutor;
+import org.eclipse.dd.dsf.concurrent.RequestMonitor;
import org.eclipse.dd.dsf.service.DsfSession;
import org.eclipse.debug.core.ILaunchConfiguration;
import com.windriver.debug.tcf.core.model.ITCFConstants;
import com.windriver.debug.tcf.core.model.TCFLaunch;
+import com.windriver.tcf.api.protocol.IChannel;
public class TCFDSFLaunch extends TCFLaunch {
-
+
private final TCFDSFExecuter executor;
private final DsfSession session;
-
+
public TCFDSFLaunch(ILaunchConfiguration launchConfiguration, String mode) {
super(launchConfiguration, mode);
executor = new TCFDSFExecuter();
session = DsfSession.startSession(executor, ITCFConstants.ID_TCF_DEBUG_MODEL);
}
+ @Override
+ protected void runLaunchSequence(final Runnable done) {
+ super.runLaunchSequence(new Runnable() {
+ public void run() {
+ IChannel channel = getChannel();
+ if (channel != null) {
+ RequestMonitor monitor = new RequestMonitor(executor, null) {
+ @Override
+ protected void handleOK() {
+ done.run();
+ }
+ };
+ TCFDSFLaunchSequence seq = new TCFDSFLaunchSequence(session, TCFDSFLaunch.this, monitor);
+ executor.execute(seq);
+ }
+ else {
+ done.run();
+ }
+ }
+ });
+ }
+
public DsfExecutor getDsfExecutor() {
return executor;
}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFLaunchSequence.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFLaunchSequence.java
new file mode 100644
index 000000000..767aca9b0
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/launch/TCFDSFLaunchSequence.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package com.windriver.tcf.dsf.core.launch;
+
+import org.eclipse.dd.dsf.concurrent.RequestMonitor;
+import org.eclipse.dd.dsf.concurrent.Sequence;
+import org.eclipse.dd.dsf.service.DsfSession;
+
+import com.windriver.tcf.api.protocol.IChannel;
+import com.windriver.tcf.dsf.core.services.TCFDSFBreakpoints;
+import com.windriver.tcf.dsf.core.services.TCFDSFMemory;
+import com.windriver.tcf.dsf.core.services.TCFDSFNativeProcesses;
+import com.windriver.tcf.dsf.core.services.TCFDSFRegisters;
+import com.windriver.tcf.dsf.core.services.TCFDSFRunControl;
+import com.windriver.tcf.dsf.core.services.TCFDSFStack;
+import com.windriver.tcf.dsf.core.services.TCFDSFStepQueueManager;
+
+class TCFDSFLaunchSequence extends Sequence {
+
+ private final Step[] steps;
+
+ TCFDSFLaunchSequence(final DsfSession session, final TCFDSFLaunch launch, RequestMonitor monitor) {
+ super(session.getExecutor(), monitor);
+ final IChannel channel = launch.getChannel();
+ steps = new Step[] {
+ new Step() {
+ @Override
+ public void execute(RequestMonitor monitor) {
+ new TCFDSFNativeProcesses(session, channel, monitor);
+ }
+ },
+ new Step() {
+ @Override
+ public void execute(RequestMonitor monitor) {
+ new TCFDSFRunControl(session, channel, monitor);
+ }
+ },
+ new Step() {
+ @Override
+ public void execute(RequestMonitor monitor) {
+ new TCFDSFStepQueueManager(session).initialize(monitor);
+ }
+ },
+ new Step() {
+ @Override
+ public void execute(RequestMonitor monitor) {
+ new TCFDSFStack(session, channel, monitor);
+ }
+ },
+ new Step() {
+ @Override
+ public void execute(RequestMonitor monitor) {
+ new TCFDSFMemory(session, channel, monitor);
+ }
+ },
+ new Step() {
+ @Override
+ public void execute(RequestMonitor monitor) {
+ new TCFDSFRegisters(session, channel, monitor);
+ }
+ },
+ new Step() {
+ @Override
+ public void execute(RequestMonitor monitor) {
+ new TCFDSFBreakpoints(session, launch, monitor);
+ }
+ },
+ };
+ }
+
+ @Override
+ public Step[] getSteps() {
+ return steps;
+ }
+}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/IDataRequest.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/IDataRequest.java
new file mode 100644
index 000000000..49cee9f49
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/IDataRequest.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package com.windriver.tcf.dsf.core.services;
+
+public interface IDataRequest {
+
+ void cancel();
+ void done();
+}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFAddress.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFAddress.java
new file mode 100644
index 000000000..0afcd6925
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFAddress.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package com.windriver.tcf.dsf.core.services;
+
+import java.math.BigInteger;
+
+import org.eclipse.cdt.core.IAddress;
+
+public final class TCFAddress implements IAddress {
+
+ private final BigInteger addr;
+
+ public TCFAddress(Number addr) {
+ if (addr instanceof BigInteger) this.addr = (BigInteger)addr;
+ else this.addr = new BigInteger(addr.toString(), 10);
+ }
+
+ public IAddress add(BigInteger i) {
+ return new TCFAddress(addr.add(i));
+ }
+
+ public IAddress add(long l) {
+ if (l == 0) return this;
+ return new TCFAddress(addr.add(BigInteger.valueOf(l)));
+ }
+
+ public BigInteger distanceTo(IAddress a) {
+ return a.getValue().subtract(addr);
+ }
+
+ public int getCharsNum() {
+ // TODO don't know what getCharsNum() is supposed to return
+ return 0;
+ }
+
+ public BigInteger getMaxOffset() {
+ // TODO don't know what getMaxOffset() is supposed to return
+ return null;
+ }
+
+ public int getSize() {
+ // TODO don't know what getSize() is supposed to return
+ return 0;
+ }
+
+ public BigInteger getValue() {
+ return addr;
+ }
+
+ public boolean isMax() {
+ return false;
+ }
+
+ public boolean isZero() {
+ return addr.equals(BigInteger.ZERO);
+ }
+
+ public String toBinaryAddressString() {
+ return toHexAddressString();
+ }
+
+ public String toHexAddressString() {
+ return "0x" + toString(16);
+ }
+
+ public String toString(int radix) {
+ return addr.toString(radix);
+ }
+
+ public int compareTo(Object o) {
+ return addr.compareTo(((TCFAddress)o).addr);
+ }
+
+ public String toString() {
+ return "[" + toHexAddressString() + "]";
+ }
+}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFBreakpoints.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFBreakpoints.java
new file mode 100644
index 000000000..c908b4740
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFBreakpoints.java
@@ -0,0 +1,307 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package com.windriver.tcf.dsf.core.services;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.dd.dsf.concurrent.RequestMonitor;
+import org.eclipse.dd.dsf.datamodel.AbstractDMContext;
+import org.eclipse.dd.dsf.datamodel.IDMContext;
+import org.eclipse.dd.dsf.service.AbstractDsfService;
+import org.eclipse.dd.dsf.service.DsfSession;
+import org.eclipse.dd.dsf.service.IDsfService;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.osgi.framework.BundleContext;
+
+import com.windriver.debug.tcf.core.TCFCore;
+import com.windriver.debug.tcf.core.model.ITCFBreakpointListener;
+import com.windriver.debug.tcf.core.model.ITCFConstants;
+import com.windriver.debug.tcf.core.model.TCFBreakpointsModel;
+import com.windriver.debug.tcf.core.model.TCFLaunch;
+import com.windriver.tcf.api.protocol.IChannel;
+import com.windriver.tcf.api.protocol.IToken;
+import com.windriver.tcf.dsf.core.Activator;
+
+// TODO IBreakpointHitEvent
+
+public class TCFDSFBreakpoints extends AbstractDsfService implements org.eclipse.dd.dsf.debug.service.IBreakpoints {
+
+ private class BreakpointDMC extends AbstractDMContext implements IBreakpointDMContext {
+
+ final String id;
+ final IBreakpoint bp;
+ final TCFDataCache<Map<String,Object>> status;
+
+ boolean disposed;
+
+ public BreakpointDMC(IDsfService service, final String id, IBreakpoint bp) {
+ super(service, new IDMContext[0]);
+ this.id = id;
+ this.bp = bp;
+ cache.put(id, this);
+ status = new TCFDataCache<Map<String,Object>>(channel) {
+ @Override
+ public boolean startDataRetrieval() {
+ assert command == null;
+ assert !disposed;
+ if (tcf_bpt_service == null) {
+ data = null;
+ valid = true;
+ return true;
+ }
+ command = tcf_bpt_service.getStatus(id, new com.windriver.tcf.api.services.IBreakpoints.DoneGetStatus() {
+ public void doneGetStatus(IToken token, Exception err, Map<String,Object> status) {
+ if (command != token) return;
+ command = null;
+ if (err != null) {
+ data = null;
+ error = err;
+ }
+ else {
+ data = status;
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+ };
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return super.baseEquals(other) && ((BreakpointDMC)other).id.equals(id);
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ void dispose() {
+ assert !disposed;
+ cache.remove(id);
+ disposed = true;
+ }
+ }
+
+ private class BreakpointData implements IBreakpointDMData {
+
+ final IBreakpoint bp;
+ final BreakpointStatus status;
+
+ BreakpointData(IBreakpoint bp, BreakpointStatus status) {
+ this.bp = bp;
+ this.status = status;
+ }
+
+ public IBreakpoint getPlatformBreakpoint() {
+ return bp;
+ }
+
+ public BreakpointStatus getStatus() {
+ return status;
+ }
+ }
+
+ private final ITCFBreakpointListener bp_listener = new ITCFBreakpointListener() {
+
+ public void breakpointStatusChanged(String id) {
+ final BreakpointDMC dmc = cache.get(id);
+ if (dmc != null) {
+ Map<String, Object> map = launch.getBreakpointsStatus().getStatus(dmc.id);
+ dmc.status.reset(map);
+ IBreakpointDMEvent e = null;
+ if (map == null) {
+ e = new IBreakpointUninstalledDMEvent() {
+ public IBreakpointDMContext getDMContext() {
+ return dmc;
+ }
+ };
+ }
+ else if (map.get(com.windriver.tcf.api.services.IBreakpoints.STATUS_ERROR) != null) {
+ e = new IBreakpointInstallFailedDMEvent() {
+ public IBreakpointDMContext getDMContext() {
+ return dmc;
+ }
+ };
+ }
+ else if (map.get(com.windriver.tcf.api.services.IBreakpoints.STATUS_PLANTED) != null) {
+ e = new IBreakpointInstalledDMEvent() {
+ public IBreakpointDMContext getDMContext() {
+ return dmc;
+ }
+ };
+ }
+ else {
+ e = new IBreakpointUninstalledDMEvent() {
+ public IBreakpointDMContext getDMContext() {
+ return dmc;
+ }
+ };
+ }
+ getSession().dispatchEvent(e, getProperties());
+ }
+ }
+
+ public void breakpointRemoved(String id) {
+ final BreakpointDMC dmc = cache.get(id);
+ if (dmc != null) {
+ dmc.dispose();
+ IBreakpointDMEvent e = new IBreakpointUninstalledDMEvent() {
+ public IBreakpointDMContext getDMContext() {
+ return dmc;
+ }
+ };
+ getSession().dispatchEvent(e, getProperties());
+ }
+ }
+ };
+
+ private final TCFLaunch launch;
+ private final IChannel channel;
+ private final com.windriver.tcf.api.services.IBreakpoints tcf_bpt_service;
+ private final Map<String,BreakpointDMC> cache = new HashMap<String,BreakpointDMC>();
+
+ public TCFDSFBreakpoints(DsfSession session, TCFLaunch launch, final RequestMonitor monitor) {
+ super(session);
+ this.launch = launch;
+ channel = launch.getChannel();
+ launch.getBreakpointsStatus().addListener(bp_listener);
+ tcf_bpt_service = channel.getRemoteService(com.windriver.tcf.api.services.IBreakpoints.class);
+ initialize(new RequestMonitor(getExecutor(), monitor) {
+ @Override
+ protected void handleOK() {
+ String[] class_names = {
+ org.eclipse.dd.dsf.debug.service.IBreakpoints.class.getName(),
+ TCFDSFBreakpoints.class.getName()
+ };
+ register(class_names, new Hashtable<String,String>());
+ monitor.done();
+ }
+ });
+ }
+
+ @Override
+ public void shutdown(RequestMonitor monitor) {
+ unregister();
+ super.shutdown(monitor);
+ }
+
+ @Override
+ protected BundleContext getBundleContext() {
+ return Activator.getBundleContext();
+ }
+
+ public void getAllBreakpoints(IDMContext ctx, DataRequestMonitor<IBreakpointDMContext[]> rm) {
+ IBreakpointManager bp_manager = DebugPlugin.getDefault().getBreakpointManager();
+ TCFBreakpointsModel m = TCFCore.getBreakpointsModel();
+ IBreakpoint[] arr = bp_manager.getBreakpoints(ITCFConstants.ID_TCF_DEBUG_MODEL);
+ ArrayList<IBreakpointDMContext> l = new ArrayList<IBreakpointDMContext>();
+ if (arr != null && arr.length == 0) {
+ for (IBreakpoint bp : arr) {
+ if (m.isSupported(channel, bp)) {
+ IMarker marker = bp.getMarker();
+ String id = marker.getAttribute(ITCFConstants.ID_TCF_DEBUG_MODEL +
+ '.' + com.windriver.tcf.api.services.IBreakpoints.PROP_ID, (String)null);
+ if (id != null) {
+ BreakpointDMC c = cache.get(id);
+ if (c == null) c = new BreakpointDMC(this, id, bp);
+ l.add(c);
+ }
+ }
+ }
+ }
+ rm.setData(l.toArray(new IBreakpointDMContext[l.size()]));
+ rm.done();
+ }
+
+ public void getBreakpoints(IDMContext dmc, IBreakpoint bp, DataRequestMonitor<IBreakpointDMContext[]> rm) {
+ TCFBreakpointsModel m = TCFCore.getBreakpointsModel();
+ ArrayList<IBreakpointDMContext> l = new ArrayList<IBreakpointDMContext>();
+ if (m.isSupported(channel, bp)) {
+ IMarker marker = bp.getMarker();
+ String id = marker.getAttribute(ITCFConstants.ID_TCF_DEBUG_MODEL +
+ '.' + com.windriver.tcf.api.services.IBreakpoints.PROP_ID, (String)null);
+ if (id != null) {
+ BreakpointDMC c = cache.get(id);
+ if (c == null) c = new BreakpointDMC(this, id, bp);
+ l.add(c);
+ }
+ }
+ rm.setData(l.toArray(new IBreakpointDMContext[l.size()]));
+ rm.done();
+ }
+
+ public void getBreakpointData(final IDMContext dmc, final DataRequestMonitor<IBreakpointDMData> rm) {
+ if (dmc instanceof BreakpointDMC) {
+ BreakpointDMC bp = (BreakpointDMC)dmc;
+ if (!bp.status.validate()) {
+ bp.status.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ getBreakpointData(dmc, rm);
+ }
+ });
+ return;
+ }
+ if (bp.status.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", bp.status.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ Map<String,Object> map = bp.status.getData();
+ BreakpointStatus status = BreakpointStatus.FILTERED_OUT;
+ if (map != null) {
+ if (map.get(com.windriver.tcf.api.services.IBreakpoints.STATUS_ERROR) != null) {
+ status = BreakpointStatus.FAILED_TO_INSTALL;
+ }
+ else if (map.get(com.windriver.tcf.api.services.IBreakpoints.STATUS_PLANTED) != null) {
+ status = BreakpointStatus.INSTALLED;
+ }
+ }
+ rm.setData(new BreakpointData(bp.bp, status));
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void getModelData(IDMContext dmc, DataRequestMonitor<?> rm) {
+ if (dmc instanceof BreakpointDMC) {
+ getBreakpointData((BreakpointDMC)dmc, (DataRequestMonitor<IBreakpointDMData>)rm);
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFExecutionDMC.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFExecutionDMC.java
index b648df9dc..65c6bf206 100644
--- a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFExecutionDMC.java
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFExecutionDMC.java
@@ -18,9 +18,45 @@ import org.eclipse.dd.dsf.service.IDsfService;
public abstract class TCFDSFExecutionDMC extends AbstractDMContext implements IExecutionDMContext, IContainerDMContext {
+ interface DataCache {
+ }
+
+ DataCache stack_frames_cache;
+ DataCache memory_cache;
+ DataCache registers_cache;
+
TCFDSFExecutionDMC(IDsfService service, IDMContext[] parents) {
super(service, parents);
}
+ /**
+ * Get TCF ID of execution context.
+ * @return TCF ID.
+ */
public abstract String getTcfContextId();
+
+ /**
+ * Check if this context object is disposed, because, for example, a thread has exited.
+ * @return true if context object is disposed.
+ */
+ public abstract boolean isDisposed();
+
+ /**
+ * Validate execution state data.
+ * @return true if state is valid, false if data retrieval is started.
+ */
+ public abstract boolean validateState();
+
+ /**
+ * Add a listener to be activated when state data retrieval is done.
+ * @param req - listener object.
+ */
+ public abstract void addStateWaitingRequest(IDataRequest req);
+
+ /**
+ * Get current program counter. This method must be called only when
+ * execution state data is valid - when validateState() return true.
+ * @return current program counter address.
+ */
+ public abstract TCFAddress getPC();
}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFMemory.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFMemory.java
new file mode 100644
index 000000000..8918fe4c3
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFMemory.java
@@ -0,0 +1,307 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package com.windriver.tcf.dsf.core.services;
+
+import java.util.Hashtable;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.dd.dsf.concurrent.RequestMonitor;
+import org.eclipse.dd.dsf.datamodel.IDMContext;
+import org.eclipse.dd.dsf.service.AbstractDsfService;
+import org.eclipse.dd.dsf.service.DsfSession;
+import org.eclipse.debug.core.model.MemoryByte;
+import org.osgi.framework.BundleContext;
+
+import com.windriver.tcf.api.protocol.IChannel;
+import com.windriver.tcf.api.protocol.IToken;
+import com.windriver.tcf.api.services.IMemory.MemoryContext;
+import com.windriver.tcf.api.services.IMemory.MemoryError;
+import com.windriver.tcf.dsf.core.Activator;
+
+public class TCFDSFMemory extends AbstractDsfService implements org.eclipse.dd.dsf.debug.service.IMemory {
+
+ private class MemoryCache implements TCFDSFExecutionDMC.DataCache {
+
+ final TCFDataCache<com.windriver.tcf.api.services.IMemory.MemoryContext> context;
+
+ MemoryCache(final IChannel channel, final TCFDSFExecutionDMC exe) {
+ context = new TCFDataCache<com.windriver.tcf.api.services.IMemory.MemoryContext>(channel) {
+ @Override
+ public boolean startDataRetrieval() {
+ assert command == null;
+ String id = exe.getTcfContextId();
+ if (id == null || tcf_mem_service == null) {
+ data = null;
+ valid = true;
+ return true;
+ }
+ command = tcf_mem_service.getContext(id,
+ new com.windriver.tcf.api.services.IMemory.DoneGetContext() {
+ public void doneGetContext(IToken token, Exception err,
+ com.windriver.tcf.api.services.IMemory.MemoryContext ctx) {
+ if (command != token) return;
+ command = null;
+ if (err != null) {
+ error = err;
+ }
+ else {
+ data = ctx;
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+ };
+ }
+ }
+
+ private final com.windriver.tcf.api.services.IMemory.MemoryListener mem_listener =
+ new com.windriver.tcf.api.services.IMemory.MemoryListener() {
+
+ public void contextAdded(MemoryContext[] contexts) {
+ }
+
+ public void contextChanged(MemoryContext[] contexts) {
+ }
+
+ public void contextRemoved(String[] context_ids) {
+ }
+
+ public void memoryChanged(String context_id, Number[] addr, long[] size) {
+ TCFDSFRunControl rc = getServicesTracker().getService(TCFDSFRunControl.class);
+ TCFDSFExecutionDMC exe = rc.getContext(context_id);
+ if (exe == null || exe.memory_cache == null) return;
+ for (int n = 0; n < addr.length; n++) {
+ long count = size[n];
+ // TODO: DSF does not support address ranges
+ if (count > 256) count = 256;
+ IAddress[] addresses = new IAddress[(int)count];
+ for (int i = 0; i < (int)count; i++) {
+ addresses[i] = new TCFAddress(addr[n]).add(i);
+ }
+ getSession().dispatchEvent(new MemoryChangedEvent(exe, addresses), getProperties());
+ }
+ }
+ };
+
+ private final IChannel channel;
+ private final com.windriver.tcf.api.services.IMemory tcf_mem_service;
+
+ public TCFDSFMemory(DsfSession session, IChannel channel, final RequestMonitor monitor) {
+ super(session);
+ this.channel = channel;
+ tcf_mem_service = channel.getRemoteService(com.windriver.tcf.api.services.IMemory.class);
+ if (tcf_mem_service != null) tcf_mem_service.addListener(mem_listener);
+ initialize(new RequestMonitor(getExecutor(), monitor) {
+ @Override
+ protected void handleOK() {
+ String[] class_names = {
+ org.eclipse.dd.dsf.debug.service.IMemory.class.getName(),
+ TCFDSFMemory.class.getName()
+ };
+ register(class_names, new Hashtable<String,String>());
+ monitor.done();
+ }
+ });
+ }
+
+ @Override
+ public void shutdown(RequestMonitor monitor) {
+ unregister();
+ super.shutdown(monitor);
+ }
+
+ @Override
+ protected BundleContext getBundleContext() {
+ return Activator.getBundleContext();
+ }
+
+ public void fillMemory(final IDMContext dmc, final IAddress address, final long offset,
+ final int word_size, final int count, final byte[] pattern, final RequestMonitor rm) {
+ if (tcf_mem_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Memory access service is not available", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ else if (dmc instanceof TCFDSFExecutionDMC) {
+ final TCFDSFExecutionDMC ctx = (TCFDSFExecutionDMC)dmc;
+ if (ctx.memory_cache == null) ctx.memory_cache = new MemoryCache(channel, ctx);
+ MemoryCache cache = (MemoryCache)ctx.memory_cache;
+ if (!cache.context.validate()) {
+ cache.context.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ fillMemory(dmc, address, offset, word_size, count, pattern, rm);
+ }
+ });
+ return;
+ }
+ if (cache.context.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", cache.context.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ com.windriver.tcf.api.services.IMemory.MemoryContext mem = cache.context.getData();
+ if (mem == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Invalid DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ mem.fill(address.add(offset).getValue(), word_size, pattern, count * word_size, 0,
+ new com.windriver.tcf.api.services.IMemory.DoneMemory() {
+ public void doneMemory(IToken token, MemoryError error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+ });
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ public void getMemory(final IDMContext dmc, final IAddress address, final long offset,
+ final int word_size, final int count, final DataRequestMonitor<MemoryByte[]> rm) {
+ if (tcf_mem_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Memory access service is not available", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ else if (dmc instanceof TCFDSFExecutionDMC) {
+ final TCFDSFExecutionDMC ctx = (TCFDSFExecutionDMC)dmc;
+ if (ctx.memory_cache == null) ctx.memory_cache = new MemoryCache(channel, ctx);
+ MemoryCache cache = (MemoryCache)ctx.memory_cache;
+ if (!cache.context.validate()) {
+ cache.context.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ getMemory(dmc, address, offset, word_size, count, rm);
+ }
+ });
+ return;
+ }
+ if (cache.context.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", cache.context.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ com.windriver.tcf.api.services.IMemory.MemoryContext mem = cache.context.getData();
+ if (mem == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Invalid DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ final byte[] buffer = new byte[word_size * count];
+ mem.get(address.add(offset).getValue(), word_size, buffer, 0, count * word_size, 0,
+ new com.windriver.tcf.api.services.IMemory.DoneMemory() {
+ public void doneMemory(IToken token, MemoryError error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ }
+ MemoryByte[] res = new MemoryByte[buffer.length];
+ for (int i = 0; i < buffer.length; i++) {
+ res[i] = new MemoryByte(buffer[i]);
+ }
+ rm.done();
+ }
+ });
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ public void setMemory(final IDMContext dmc, final IAddress address, final long offset,
+ final int word_size, final int count, final byte[] buffer, final RequestMonitor rm) {
+ if (tcf_mem_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Memory access service is not available", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ else if (dmc instanceof TCFDSFExecutionDMC) {
+ final TCFDSFExecutionDMC ctx = (TCFDSFExecutionDMC)dmc;
+ if (ctx.memory_cache == null) ctx.memory_cache = new MemoryCache(channel, ctx);
+ MemoryCache cache = (MemoryCache)ctx.memory_cache;
+ if (!cache.context.validate()) {
+ cache.context.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ setMemory(dmc, address, offset, word_size, count, buffer, rm);
+ }
+ });
+ return;
+ }
+ if (cache.context.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", cache.context.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ com.windriver.tcf.api.services.IMemory.MemoryContext mem = cache.context.getData();
+ if (mem == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Invalid DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ mem.set(address.add(offset).getValue(), word_size, buffer, 0, count * word_size, 0,
+ new com.windriver.tcf.api.services.IMemory.DoneMemory() {
+ public void doneMemory(IToken token, MemoryError error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+ });
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFNativeProcesses.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFNativeProcesses.java
index 5c1235ae6..792f4fdae 100644
--- a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFNativeProcesses.java
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFNativeProcesses.java
@@ -12,13 +12,17 @@ package com.windriver.tcf.dsf.core.services;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
import org.eclipse.dd.dsf.concurrent.RequestMonitor;
+import org.eclipse.dd.dsf.datamodel.AbstractDMEvent;
import org.eclipse.dd.dsf.datamodel.IDMContext;
import org.eclipse.dd.dsf.datamodel.ServiceDMContext;
import org.eclipse.dd.dsf.debug.service.INativeProcesses;
@@ -29,17 +33,19 @@ import org.osgi.framework.BundleContext;
import com.windriver.tcf.api.protocol.IChannel;
import com.windriver.tcf.api.protocol.IToken;
import com.windriver.tcf.api.services.IProcesses;
+import com.windriver.tcf.api.services.IRunControl;
import com.windriver.tcf.api.services.IProcesses.ProcessContext;
+import com.windriver.tcf.api.services.IRunControl.RunControlContext;
import com.windriver.tcf.dsf.core.Activator;
public class TCFDSFNativeProcesses extends AbstractDsfService implements INativeProcesses {
-
- private class ProcessDMC extends TCFDSFProcessDMC {
-
+
+ private class ProcessDMC extends TCFDSFProcessDMC implements IProcessDMContext {
+
final String id;
-
- ProcessDMC(String id) {
- super(TCFDSFNativeProcesses.this, new IDMContext[0]);
+
+ ProcessDMC(String id, IDMContext parent) {
+ super(TCFDSFNativeProcesses.this, parent != null ? new IDMContext[]{ parent } : new IDMContext[0]);
this.id = id;
}
@@ -50,19 +56,23 @@ public class TCFDSFNativeProcesses extends AbstractDsfService implements INative
@Override
public boolean equals(Object obj) {
- return super.baseEquals(obj) && ((ProcessDMC)obj).id.equals(id);
+ if (!super.baseEquals(obj)) return false;
+ String obj_id = ((ProcessDMC)obj).id;
+ if (obj_id == null) return id == null;
+ return obj_id.equals(id);
}
@Override
public int hashCode() {
+ if (id == null) return 0;
return id.hashCode();
}
}
-
- private class ThreadDMC extends TCFDSFThreadDMC {
-
+
+ private class ThreadDMC extends TCFDSFThreadDMC implements IThreadDMContext {
+
final String id;
-
+
ThreadDMC(String id) {
super(TCFDSFNativeProcesses.this, new IDMContext[0]);
this.id = id;
@@ -75,7 +85,10 @@ public class TCFDSFNativeProcesses extends AbstractDsfService implements INative
@Override
public boolean equals(Object obj) {
- return super.baseEquals(obj) && ((ThreadDMC)obj).id.equals(id);
+ if (!super.baseEquals(obj)) return false;
+ String obj_id = ((ThreadDMC)obj).id;
+ if (obj_id == null) return id == null;
+ return obj_id.equals(id);
}
@Override
@@ -83,19 +96,17 @@ public class TCFDSFNativeProcesses extends AbstractDsfService implements INative
return id.hashCode();
}
}
-
- private static class ProcessData implements IProcessDMData {
-
+
+ private class ProcessData implements IProcessDMData {
+
private final IProcesses.ProcessContext ctx;
-
+
ProcessData(IProcesses.ProcessContext ctx) {
this.ctx = ctx;
}
public IDMContext getDebugContext() {
- // TODO Auto-generated method stub
- assert false;
- return null;
+ return getServicesTracker().getService(TCFDSFRunControl.class).getContext(ctx.getID());
}
public String getId() {
@@ -114,46 +125,184 @@ public class TCFDSFNativeProcesses extends AbstractDsfService implements INative
return true;
}
}
-
- private static class ThreadData implements IThreadDMData {
- private final IProcesses.ProcessContext ctx;
-
- ThreadData(IProcesses.ProcessContext ctx) {
+ private class ThreadData implements IThreadDMData {
+
+ private final TCFDSFExecutionDMC ctx;
+
+ ThreadData(TCFDSFExecutionDMC ctx) {
this.ctx = ctx;
}
public IDMContext getDebugContext() {
- // TODO Auto-generated method stub
- assert false;
- return null;
+ return ctx;
}
public String getId() {
- return ctx.getID();
+ if (ctx == null) return null;
+ return ctx.getTcfContextId();
}
public String getName() {
- return ctx.getName();
+ // TODO thread name
+ return "";
}
public boolean isDebuggerAttached() {
- return ctx.isAttached();
+ return true;
}
public boolean isValid() {
return true;
}
+ }
+
+ private class ProcessStartedEvent extends AbstractDMEvent<IDMContext> implements IProcessStartedEvent {
+
+ private final IProcessDMContext prs;
+
+ ProcessStartedEvent(IDMContext dmc, IProcessDMContext prs) {
+ super(dmc);
+ this.prs = prs;
+ }
+ public IProcessDMContext getProcess() {
+ return prs;
+ }
+ }
+
+ private class ProcessExitedEvent extends AbstractDMEvent<IDMContext> implements IProcessExitedEvent {
+
+ private final IProcessDMContext prs;
+
+ ProcessExitedEvent(IDMContext dmc, IProcessDMContext prs) {
+ super(dmc);
+ this.prs = prs;
+ }
+
+ public IProcessDMContext getProcess() {
+ return prs;
+ }
}
- final IProcesses service;
+ private final com.windriver.tcf.api.services.IRunControl.RunControlListener run_listener =
+ new com.windriver.tcf.api.services.IRunControl.RunControlListener() {
+
+ public void containerResumed(String[] context_ids) {
+ }
+
+ public void containerSuspended(String context, String pc,
+ String reason, Map<String, Object> params,
+ String[] suspended_ids) {
+ }
+
+ public void contextAdded(RunControlContext[] contexts) {
+ for (RunControlContext ctx : contexts) {
+ String id = ctx.getID();
+ if (id.equals(ctx.getProperties().get(IRunControl.PROP_PROCESS_ID))) {
+ ProcessDMC dmc = new ProcessDMC(id, root_dmc);
+ process_cache.put(id, dmc);
+ getSession().dispatchEvent(new ProcessStartedEvent(root_dmc, dmc), getProperties());
+ }
+ else {
+ ThreadDMC dmc = new ThreadDMC(id);
+ thread_cache.put(id, dmc);
+ }
+ }
+ }
+
+ public void contextChanged(RunControlContext[] contexts) {
+ }
+
+ public void contextException(String context, String msg) {
+ }
+
+ public void contextRemoved(String[] context_ids) {
+ for (String id : context_ids) {
+ ProcessDMC dmc = process_cache.remove(id);
+ if (dmc != null) {
+ getSession().dispatchEvent(new ProcessExitedEvent(root_dmc, dmc), getProperties());
+ }
+ else {
+ thread_cache.remove(id);
+ }
+ }
+ }
+
+ public void contextResumed(String context) {
+ }
+
+ public void contextSuspended(String context, String pc,
+ String reason, Map<String, Object> params) {
+ }
+ };
+
+ private final IProcesses tcf_prs_service;
+ private final com.windriver.tcf.api.services.IRunControl tcf_run_service;
+ private final Map<String,ProcessDMC> process_cache = new HashMap<String,ProcessDMC>(); // all attached processes
+ private final Map<String,ThreadDMC> thread_cache = new HashMap<String,ThreadDMC>(); // only some of attached threads
+ private final ProcessDMC root_dmc = new ProcessDMC(null, null);
private IDMContext service_dmc;
-
- TCFDSFNativeProcesses(DsfSession session, IChannel channel) {
+
+ public TCFDSFNativeProcesses(DsfSession session, IChannel channel, final RequestMonitor monitor) {
super(session);
- service = channel.getRemoteService(IProcesses.class);
+ tcf_prs_service = channel.getRemoteService(IProcesses.class);
+ tcf_run_service = channel.getRemoteService(com.windriver.tcf.api.services.IRunControl.class);
+ if (tcf_run_service != null) tcf_run_service.addListener(run_listener);
service_dmc = new ServiceDMContext(this, "#native_process");
+ initialize(new RequestMonitor(getExecutor(), monitor) {
+ @Override
+ protected void handleOK() {
+ String[] class_names = {
+ INativeProcesses.class.getName(),
+ TCFDSFNativeProcesses.class.getName()
+ };
+ register(class_names, new Hashtable<String,String>());
+ monitor.done();
+ }
+ });
+ }
+
+ @Override
+ public void initialize(final RequestMonitor monitor) {
+ final Collection<String> list = new ArrayList<String>();
+ final Set<IToken> cmds = new HashSet<IToken>();
+ final IProcesses.DoneGetChildren done = new IProcesses.DoneGetChildren() {
+ public void doneGetChildren(IToken token, Exception error, String[] context_ids) {
+ if (cmds.isEmpty()) return;
+ assert cmds.contains(token);
+ cmds.remove(token);
+ if (error != null) {
+ for (IToken t : cmds) t.cancel();
+ cmds.clear();
+ monitor.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ monitor.done();
+ }
+ else {
+ for (String id : context_ids) {
+ list.add(id);
+ cmds.add(tcf_prs_service.getChildren(id, true, this));
+ }
+ if (cmds.isEmpty()) {
+ for (String id : list) {
+ assert id != null;
+ if (process_cache.get(id) != null) continue;
+ process_cache.put(id, new ProcessDMC(id, root_dmc));
+ }
+ process_cache.put(null, root_dmc);
+ TCFDSFNativeProcesses.super.initialize(monitor);
+ }
+ }
+ }
+ };
+ cmds.add(tcf_prs_service.getChildren(null, true, done));
+ }
+
+ @Override
+ public void shutdown(RequestMonitor monitor) {
+ unregister();
+ super.shutdown(monitor);
}
@Override
@@ -168,30 +317,170 @@ public class TCFDSFNativeProcesses extends AbstractDsfService implements INative
public boolean isValid() {
return true;
}
-
- public void attachDebuggerToProcess(IProcessDMContext ctx, RequestMonitor rm) {
- // TODO Auto-generated method stub
- assert false;
+
+ public void attachDebuggerToProcess(IProcessDMContext ctx, final RequestMonitor rm) {
+ if (tcf_prs_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Service not available", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ else if (ctx instanceof ProcessDMC) {
+ final ProcessDMC p = (ProcessDMC)ctx;
+ tcf_prs_service.getContext(p.id, new IProcesses.DoneGetContext() {
+ public void doneGetContext(IToken token, Exception error, ProcessContext context) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Cannot read processs attributes", error)); //$NON-NLS-1$
+ rm.done();
+ }
+ else if (context == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Invalid processs ID", error)); //$NON-NLS-1$
+ rm.done();
+ }
+ else {
+ context.attach(new IProcesses.DoneCommand() {
+ public void doneCommand(IToken token, Exception error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Cannot attach a process", error)); //$NON-NLS-1$
+ }
+ assert error != null || process_cache.get(p.id) != null;
+ rm.done();
+ }
+ });
+ }
+ }
+ });
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
}
- public void canTerminate(IDMContext ctx, DataRequestMonitor<Boolean> rm) {
- // TODO Auto-generated method stub
- assert false;
+ public void canTerminate(IDMContext ctx, final DataRequestMonitor<Boolean> rm) {
+ rm.setData(false);
+ if (tcf_prs_service == null) {
+ rm.done();
+ }
+ else if (ctx instanceof ProcessDMC) {
+ ProcessDMC p = (ProcessDMC)ctx;
+ tcf_prs_service.getContext(p.id, new IProcesses.DoneGetContext() {
+ public void doneGetContext(IToken token, Exception error, ProcessContext context) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Cannot read processs attributes", error)); //$NON-NLS-1$
+ }
+ else if (context == null) {
+ rm.setData(false);
+ }
+ else {
+ rm.setData(context.canTerminate());
+ }
+ rm.done();
+ }
+ });
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
}
- public void terminate(IDMContext ctx, RequestMonitor requestMonitor) {
- // TODO Auto-generated method stub
- assert false;
+ public void terminate(IDMContext ctx, final RequestMonitor rm) {
+ if (tcf_prs_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Service not available", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ else if (ctx instanceof ProcessDMC) {
+ ProcessDMC p = (ProcessDMC)ctx;
+ tcf_prs_service.getContext(p.id, new IProcesses.DoneGetContext() {
+ public void doneGetContext(IToken token, Exception error, ProcessContext context) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Cannot read processs attributes", error)); //$NON-NLS-1$
+ rm.done();
+ }
+ else if (context == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Invalid processs ID", error)); //$NON-NLS-1$
+ rm.done();
+ }
+ else {
+ context.terminate(new IProcesses.DoneCommand() {
+ public void doneCommand(IToken token, Exception error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Cannot terminate a process", error)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+ });
+ }
+ }
+ });
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
}
- public void debugNewProcess(String file, DataRequestMonitor<IProcessDMContext> rm) {
- // TODO Auto-generated method stub
- assert false;
+ public void debugNewProcess(String file, final DataRequestMonitor<IProcessDMContext> rm) {
+ if (tcf_prs_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Service not available", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ else {
+ tcf_prs_service.start(null, file, null, null, true, new IProcesses.DoneStart() {
+ public void doneStart(IToken token, Exception error, ProcessContext process) {
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Cannot start a process", error)); //$NON-NLS-1$
+ }
+ else {
+ ProcessDMC dmc = process_cache.get(process.getID());
+ assert dmc != null;
+ rm.setData(dmc);
+ }
+ rm.done();
+ }
+ });
+ }
}
- public void runNewProcess(String file, DataRequestMonitor<IProcessDMContext> rm) {
- // TODO Auto-generated method stub
- assert false;
+ public void runNewProcess(String file, final DataRequestMonitor<IProcessDMContext> rm) {
+ if (tcf_prs_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Service not available", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ else {
+ tcf_prs_service.start(null, file, null, null, false, new IProcesses.DoneStart() {
+ public void doneStart(IToken token, Exception error, ProcessContext process) {
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Cannot start a process", error)); //$NON-NLS-1$
+ }
+ else {
+ assert process_cache.get(process.getID()) == null;
+ rm.setData(new ProcessDMC(process.getID(), root_dmc));
+ }
+ rm.done();
+ }
+ });
+ }
}
public IProcessDMContext getProcessForDebugContext(IDMContext ctx) {
@@ -200,7 +489,7 @@ public class TCFDSFNativeProcesses extends AbstractDsfService implements INative
}
if (ctx instanceof TCFDSFExecutionDMC) {
String id = ((TCFDSFExecutionDMC)ctx).getTcfContextId();
- return new ProcessDMC(id);
+ return process_cache.get(id);
}
return null;
}
@@ -211,36 +500,16 @@ public class TCFDSFNativeProcesses extends AbstractDsfService implements INative
}
if (ctx instanceof TCFDSFExecutionDMC) {
String id = ((TCFDSFExecutionDMC)ctx).getTcfContextId();
- return new ThreadDMC(id);
+ ThreadDMC dmc = thread_cache.get(id);
+ if (dmc == null) dmc = new ThreadDMC(id);
+ return dmc;
}
return null;
}
- public void getProcessesBeingDebugged(final DataRequestMonitor<IProcessDMContext[]> rm) {
- final Collection<String> list = new ArrayList<String>();
- final Set<IToken> cmds = new HashSet<IToken>();
- final IProcesses.DoneGetChildren done = new IProcesses.DoneGetChildren() {
- public void doneGetChildren(IToken token, Exception error, String[] context_ids) {
- if (cmds.isEmpty()) return;
- assert cmds.contains(token);
- cmds.remove(token);
- if (error != null) {
- for (IToken t : cmds) t.cancel();
- cmds.clear();
- rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
- rm.done();
- }
- else {
- for (String id : context_ids) {
- list.add(id);
- cmds.add(service.getChildren(id, true, this));
- }
- if (cmds.isEmpty()) createDMContexts(list, rm);
- }
- }
- };
- cmds.add(service.getChildren(null, true, done));
+ public void getProcessesBeingDebugged(DataRequestMonitor<IProcessDMContext[]> rm) {
+ rm.setData(process_cache.values().toArray(new IProcessDMContext[process_cache.size()]));
+ rm.done();
}
public void getRunningProcesses(final DataRequestMonitor<IProcessDMContext[]> rm) {
@@ -261,72 +530,85 @@ public class TCFDSFNativeProcesses extends AbstractDsfService implements INative
else {
for (String id : context_ids) {
list.add(id);
- cmds.add(service.getChildren(id, false, this));
+ cmds.add(tcf_prs_service.getChildren(id, false, this));
+ }
+ if (cmds.isEmpty()) {
+ int cnt = 0;
+ IProcessDMContext[] data = new IProcessDMContext[list.size()];
+ for (String id : list) {
+ assert id != null;
+ data[cnt] = process_cache.get(id);
+ if (data[cnt] == null) data[cnt] = new ProcessDMC(id, root_dmc);
+ cnt++;
+ }
+ rm.setData(data);
+ rm.done();
}
- if (cmds.isEmpty()) createDMContexts(list, rm);
}
}
};
- cmds.add(service.getChildren(null, false, done));
+ cmds.add(tcf_prs_service.getChildren(null, false, done));
}
@SuppressWarnings("unchecked")
public void getModelData(IDMContext dmc, final DataRequestMonitor<?> rm) {
if (dmc instanceof ProcessDMC) {
- service.getContext(((ProcessDMC)dmc).id, new IProcesses.DoneGetContext() {
+ getProcessData((ProcessDMC)dmc, (DataRequestMonitor<IProcessDMData>)rm);
+ }
+ else if (dmc instanceof ThreadDMC) {
+ getThreadData((ThreadDMC)dmc, (DataRequestMonitor<IThreadDMData>)rm);
+ }
+ else if (dmc == service_dmc) {
+ ((DataRequestMonitor<TCFDSFNativeProcesses>)rm).setData(this);
+ rm.done();
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ public void getProcessData(IProcessDMContext dmc, final DataRequestMonitor<IProcessDMData> rm) {
+ if (dmc instanceof ProcessDMC) {
+ tcf_prs_service.getContext(((ProcessDMC)dmc).id, new IProcesses.DoneGetContext() {
@SuppressWarnings("unchecked")
public void doneGetContext(IToken token, Exception error, ProcessContext context) {
+ if (rm.isCanceled()) return;
if (error != null) {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- REQUEST_FAILED, "Data error", error)); //$NON-NLS-1$
+ REQUEST_FAILED, "Cannot read processs attributes", error)); //$NON-NLS-1$
}
- else {
- ((DataRequestMonitor<IProcessDMData>)rm).setData(new ProcessData(context));
- }
- rm.done();
- }
- });
- }
- else if (dmc instanceof ThreadDMC) {
- service.getContext(((ProcessDMC)dmc).id, new IProcesses.DoneGetContext() {
-
- @SuppressWarnings("unchecked")
- public void doneGetContext(IToken token, Exception error, ProcessContext context) {
- if (error != null) {
+ else if (context == null) {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- REQUEST_FAILED, "Data error", error)); //$NON-NLS-1$
+ REQUEST_FAILED, "Invalid processs ID", error)); //$NON-NLS-1$
}
else {
- ((DataRequestMonitor<IThreadDMData>)rm).setData(new ThreadData(context));
+ rm.setData(new ProcessData(context));
}
rm.done();
}
});
}
- else if (dmc == service_dmc) {
- ((DataRequestMonitor<TCFDSFNativeProcesses>)rm).setData(this);
- rm.done();
- }
else {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
rm.done();
}
}
-
- private void createDMContexts(Collection<String> ids, DataRequestMonitor<IProcessDMContext[]> rm) {
- assert false;
- }
-
- public void getProcessData(IProcessDMContext dmc,
- DataRequestMonitor<IProcessDMData> rm) {
- // TODO Auto-generated method stub
-
- }
- public void getThreadData(IThreadDMContext dmc, DataRequestMonitor<IThreadDMData> rm) {
- // TODO Auto-generated method stub
- assert false;
+ public void getThreadData(IThreadDMContext dmc, final DataRequestMonitor<IThreadDMData> rm) {
+ if (dmc instanceof ThreadDMC) {
+ String id = ((ThreadDMC)dmc).id;
+ TCFDSFRunControl rc = getServicesTracker().getService(TCFDSFRunControl.class);
+ rm.setData(new ThreadData(rc.getContext(id)));
+ rm.done();
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
}
}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFProcessDMC.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFProcessDMC.java
index 427fb92bf..e6c673e79 100644
--- a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFProcessDMC.java
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFProcessDMC.java
@@ -16,7 +16,7 @@ import org.eclipse.dd.dsf.debug.service.INativeProcesses.IProcessDMContext;
import org.eclipse.dd.dsf.service.IDsfService;
public abstract class TCFDSFProcessDMC extends AbstractDMContext implements IProcessDMContext {
-
+
TCFDSFProcessDMC(IDsfService service, IDMContext[] parents) {
super(service, parents);
}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFRegisters.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFRegisters.java
new file mode 100644
index 000000000..80abe7aee
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFRegisters.java
@@ -0,0 +1,1060 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package com.windriver.tcf.dsf.core.services;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.dd.dsf.concurrent.RequestMonitor;
+import org.eclipse.dd.dsf.datamodel.AbstractDMContext;
+import org.eclipse.dd.dsf.datamodel.AbstractDMEvent;
+import org.eclipse.dd.dsf.datamodel.IDMContext;
+import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext;
+import org.eclipse.dd.dsf.debug.service.IRunControl.StateChangeReason;
+import org.eclipse.dd.dsf.service.AbstractDsfService;
+import org.eclipse.dd.dsf.service.DsfServiceEventHandler;
+import org.eclipse.dd.dsf.service.DsfSession;
+import org.osgi.framework.BundleContext;
+
+import com.windriver.tcf.api.protocol.IChannel;
+import com.windriver.tcf.api.protocol.IToken;
+import com.windriver.tcf.api.services.IRegisters.DoneGet;
+import com.windriver.tcf.api.services.IRegisters.DoneSet;
+import com.windriver.tcf.api.services.IRegisters.NamedValue;
+import com.windriver.tcf.dsf.core.Activator;
+
+public class TCFDSFRegisters extends AbstractDsfService implements org.eclipse.dd.dsf.debug.service.IRegisters {
+
+ private class ObjectDMC extends AbstractDMContext implements IFormattedDataDMContext {
+
+ final String id;
+ final RegistersCache children;
+ final Map<String,ValueDMC> values;
+
+ com.windriver.tcf.api.services.IRegisters.RegistersContext context;
+ boolean disposed;
+
+ ObjectDMC(String session_id, IDMContext[] parents, String id) {
+ super(session_id, parents);
+ this.id = id;
+ children = new RegistersCache(channel, id, new IDMContext[]{ this });
+ values = new HashMap<String,ValueDMC>();
+ model.put(id, this);
+ }
+
+ ObjectDMC(String session_id, IDMContext[] parents, String id, RegistersCache children) {
+ super(session_id, parents);
+ this.id = id;
+ this.children = children;
+ values = new HashMap<String,ValueDMC>();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return super.baseEquals(other) && ((ObjectDMC)other).id.equals(id);
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ public String getName() {
+ return context.getName();
+ }
+
+ void dispose() {
+ assert !disposed;
+ children.dispose();
+ for (ValueDMC v : values.values()) v.dispose();
+ values.clear();
+ model.remove(id);
+ disposed = true;
+ }
+ }
+
+ private class RegisterGroupDMC extends ObjectDMC implements IRegisterGroupDMContext {
+
+ RegisterGroupDMC(String session_id, IDMContext[] parents, String id) {
+ super(session_id, parents, id);
+ }
+
+ /* Constructor for a fake register group - DSF requires at least one group object */
+ RegisterGroupDMC(String session_id, IDMContext[] parents, final String id, RegistersCache children) {
+ super(session_id, parents, id, children);
+ context = new com.windriver.tcf.api.services.IRegisters.RegistersContext() {
+ public String[] getAvailableFormats() {
+ return null;
+ }
+ public int[] getBitNumbers() {
+ return null;
+ }
+ public String getDescription() {
+ return null;
+ }
+ public int getFirstBitNumber() {
+ return 0;
+ }
+ public String getID() {
+ return id;
+ }
+ public String getName() {
+ return null;
+ }
+ public NamedValue[] getNamedValues() {
+ return null;
+ }
+ public String getParentID() {
+ return null;
+ }
+ public Map<String, Object> getProperties() {
+ return null;
+ }
+ public boolean hasSideEffects() {
+ return false;
+ }
+ public boolean isBigEndian() {
+ return false;
+ }
+ public boolean isFloat() {
+ return false;
+ }
+ public boolean isLeftToRight() {
+ return false;
+ }
+ public boolean isReadOnce() {
+ return false;
+ }
+ public boolean isReadable() {
+ return false;
+ }
+ public boolean isVolatile() {
+ return false;
+ }
+ public boolean isWriteOnce() {
+ return false;
+ }
+ public boolean isWriteable() {
+ return false;
+ }
+ public IToken get(String format, DoneGet done) {
+ throw new Error();
+ }
+ public IToken set(String format, String value, DoneSet done) {
+ throw new Error();
+ }
+ };
+ }
+ }
+
+ private class RegisterDMC extends ObjectDMC implements IRegisterDMContext {
+
+ RegisterDMC(String session_id, IDMContext[] parents, String id) {
+ super(session_id, parents, id);
+ }
+ }
+
+ private class BitFieldDMC extends ObjectDMC implements IBitFieldDMContext {
+
+ BitFieldDMC(String session_id, IDMContext[] parents, String id) {
+ super(session_id, parents, id);
+ }
+ }
+
+ private class ValueDMC extends FormattedValueDMContext {
+
+ final RegisterValueCache cache;
+
+ boolean disposed;
+
+ ValueDMC(ObjectDMC parent, String fmt) {
+ super(TCFDSFRegisters.this, parent, fmt);
+ cache = new RegisterValueCache(channel, parent.context, fmt);
+ }
+
+ void dispose() {
+ assert !disposed;
+ cache.dispose();
+ disposed = true;
+ }
+ }
+
+ private class RegisterGroupData implements IRegisterGroupDMData {
+
+ final com.windriver.tcf.api.services.IRegisters.RegistersContext context;
+
+ RegisterGroupData(com.windriver.tcf.api.services.IRegisters.RegistersContext context) {
+ this.context = context;
+ }
+
+ public String getDescription() {
+ return context.getDescription();
+ }
+
+ public String getName() {
+ return context.getName();
+ }
+ }
+
+ private class RegisterData implements IRegisterDMData {
+
+ final com.windriver.tcf.api.services.IRegisters.RegistersContext context;
+
+ RegisterData(com.windriver.tcf.api.services.IRegisters.RegistersContext context) {
+ this.context = context;
+ }
+
+ public String getDescription() {
+ return context.getDescription();
+ }
+
+ public String getName() {
+ return context.getName();
+ }
+
+ public boolean hasSideEffects() {
+ return context.hasSideEffects();
+ }
+
+ public boolean isFloat() {
+ return context.isFloat();
+ }
+
+ public boolean isReadOnce() {
+ return context.isReadOnce();
+ }
+
+ public boolean isReadable() {
+ return context.isReadable();
+ }
+
+ public boolean isVolatile() {
+ return context.isVolatile();
+ }
+
+ public boolean isWriteOnce() {
+ return context.isWriteOnce();
+ }
+
+ public boolean isWriteable() {
+ return context.isWriteable();
+ }
+ }
+
+ private class BitFieldData implements IBitFieldDMData {
+
+ final com.windriver.tcf.api.services.IRegisters.RegistersContext context;
+
+ IMnemonic[] mnemonics;
+ IBitGroup[] bit_groups;
+
+ BitFieldData(com.windriver.tcf.api.services.IRegisters.RegistersContext context) {
+ this.context = context;
+ }
+
+ public IBitGroup[] getBitGroup() {
+ if (bit_groups == null) {
+ int[] arr = context.getBitNumbers();
+ if (arr == null) {
+ bit_groups = new IBitGroup[0];
+ }
+ else {
+ Arrays.sort(arr);
+ ArrayList<IBitGroup> l = new ArrayList<IBitGroup>();
+ int i = 0;
+ while (i < arr.length) {
+ int j = i;
+ while (j + 1 < arr.length && arr[j + 1] == arr[j] + 1) j++;
+ final int i0 = i;
+ final int i1 = j;
+ l.add(new IBitGroup() {
+ public int bitCount() {
+ return i1 - i0 + 1;
+ }
+ public int startBit() {
+ return i0;
+ }
+ });
+ i = j + 1;
+ }
+ bit_groups = l.toArray(new IBitGroup[l.size()]);
+ }
+ }
+ return bit_groups;
+ }
+
+ public IMnemonic getCurrentMnemonicValue() {
+ // TODO getCurrentMnemonicValue() should be async
+ return null;
+ }
+
+ public String getDescription() {
+ return context.getDescription();
+ }
+
+ public IMnemonic[] getMnemonics() {
+ if (mnemonics == null) {
+ NamedValue[] arr = context.getNamedValues();
+ if (arr == null) {
+ mnemonics = new IMnemonic[0];
+ }
+ else {
+ int cnt = 0;
+ mnemonics = new IMnemonic[arr.length];
+ for (final NamedValue v : arr) {
+ mnemonics[cnt++] = new IMnemonic() {
+ public String getLongName() {
+ return v.getDescription();
+ }
+ public String getShortName() {
+ return v.getName();
+ }
+ };
+ }
+ }
+ }
+ return mnemonics;
+ }
+
+ public String getName() {
+ return context.getName();
+ }
+
+ public boolean hasSideEffects() {
+ return context.hasSideEffects();
+ }
+
+ public boolean isReadOnce() {
+ return context.isReadOnce();
+ }
+
+ public boolean isReadable() {
+ return context.isReadable();
+ }
+
+ public boolean isWriteOnce() {
+ return context.isWriteOnce();
+ }
+
+ public boolean isWriteable() {
+ return context.isWriteable();
+ }
+
+ public boolean isZeroBasedNumbering() {
+ return context.getFirstBitNumber() == 0;
+ }
+
+ public boolean isZeroBitLeftMost() {
+ return context.isLeftToRight();
+ }
+ }
+
+ private class RegistersCache extends TCFDataCache<Map<String,ObjectDMC>>
+ implements TCFDSFExecutionDMC.DataCache {
+
+ final String id;
+ final IDMContext[] parents;
+
+ boolean disposed;
+
+ public RegistersCache(IChannel channel, String id, IDMContext[] parents) {
+ super(channel);
+ this.id = id;
+ this.parents = parents;
+ }
+
+ void invalidateRegContents() {
+ if (data == null) return;
+ for (ObjectDMC dmc : data.values()) {
+ for (ValueDMC val : dmc.values.values()) val.cache.reset();
+ dmc.children.invalidateRegContents();
+ }
+ }
+
+ void dispose() {
+ assert !disposed;
+ if (data != null) {
+ for (ObjectDMC dmc : data.values()) dmc.dispose();
+ }
+ reset();
+ disposed = true;
+ }
+
+ @Override
+ public boolean startDataRetrieval() {
+ assert command == null;
+ assert !disposed;
+ if (tcf_reg_service == null) {
+ data = null;
+ valid = true;
+ return true;
+ }
+ command = tcf_reg_service.getChildren(id, new com.windriver.tcf.api.services.IRegisters.DoneGetChildren() {
+ public void doneGetChildren(IToken token, Exception err, String[] contexts) {
+ if (command != token) return;
+ command = null;
+ if (err != null) {
+ data = null;
+ error = err;
+ }
+ else {
+ data = new LinkedHashMap<String,ObjectDMC>();
+ if (contexts.length > 0) {
+ // TODO DSF service design does not support lazy retrieval of context attributes (because getName() is not async)
+ final Set<IToken> cmds = new HashSet<IToken>();
+ final IToken cb = new IToken() {
+ public boolean cancel() {
+ for (IToken x : cmds) x.cancel();
+ return false;
+ }
+ };
+ command = cb;
+ com.windriver.tcf.api.services.IRegisters.DoneGetContext done = new com.windriver.tcf.api.services.IRegisters.DoneGetContext() {
+ public void doneGetContext(IToken token, Exception err,
+ com.windriver.tcf.api.services.IRegisters.RegistersContext context) {
+ cmds.remove(token);
+ if (command != cb) return;
+ if (err != null) {
+ command.cancel();
+ command = null;
+ data = null;
+ error = err;
+ valid = true;
+ validate();
+ return;
+ }
+ String id = context.getID();
+ ObjectDMC dmc = null;
+ if (context.getBitNumbers() != null) {
+ dmc = new BitFieldDMC(getSession().getId(), parents, id);
+ }
+ else if (context.isReadable() || context.isWriteable()) {
+ dmc = new RegisterDMC(getSession().getId(), parents, id);
+ }
+ else {
+ dmc = new RegisterGroupDMC(getSession().getId(), parents, id);
+ }
+ dmc.context = context;
+ data.put(id, dmc);
+ if (cmds.isEmpty()) {
+ command = null;
+ valid = true;
+ validate();
+ }
+ }
+ };
+ for (String id : contexts) {
+ cmds.add(tcf_reg_service.getContext(id, done));
+ }
+ return;
+ }
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+ }
+
+ private class RegisterValueCache extends TCFDataCache<FormattedValueDMData> {
+
+ final com.windriver.tcf.api.services.IRegisters.RegistersContext context;
+ final String fmt;
+
+ boolean disposed;
+
+ public RegisterValueCache(IChannel channel,
+ com.windriver.tcf.api.services.IRegisters.RegistersContext context, String fmt) {
+ super(channel);
+ this.context = context;
+ this.fmt = fmt;
+ }
+
+ @Override
+ public boolean startDataRetrieval() {
+ assert command == null;
+ assert tcf_reg_service != null;
+ assert context != null;
+ assert !disposed;
+ command = context.get(fmt, new com.windriver.tcf.api.services.IRegisters.DoneGet() {
+ public void doneGet(IToken token, Exception err, String value) {
+ if (command != token) return;
+ command = null;
+ if (err != null) {
+ data = null;
+ error = err;
+ }
+ else {
+ data = new FormattedValueDMData(value);
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+
+ void dispose() {
+ assert !disposed;
+ reset();
+ disposed = true;
+ }
+ }
+
+ private static class RegisterGroupChangedEvent extends AbstractDMEvent<IRegisterGroupDMContext>
+ implements IGroupChangedDMEvent {
+
+ public RegisterGroupChangedEvent(IRegisterGroupDMContext context) {
+ super(context);
+ }
+ }
+
+ private static class RegisterChangedEvent extends AbstractDMEvent<IRegisterDMContext>
+ implements IRegisterChangedDMEvent {
+
+ public RegisterChangedEvent(IRegisterDMContext context) {
+ super(context);
+ }
+ }
+
+ private static class BitFieldChangedEvent extends AbstractDMEvent<IBitFieldDMContext>
+ implements IBitFieldChangedDMEvent {
+
+ public BitFieldChangedEvent(IBitFieldDMContext context) {
+ super(context);
+ }
+ }
+
+ private static class GroupsChangedEvent
+ extends AbstractDMEvent<org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext>
+ implements IGroupsChangedDMEvent {
+
+ public GroupsChangedEvent(IExecutionDMContext context) {
+ super(context);
+ }
+ }
+
+ private final com.windriver.tcf.api.services.IRegisters.RegistersListener listener =
+ new com.windriver.tcf.api.services.IRegisters.RegistersListener() {
+
+ public void contextChanged() {
+ TCFDSFRunControl rc = getServicesTracker().getService(TCFDSFRunControl.class);
+ for (TCFDSFExecutionDMC dmc : rc.getCachedContexts()) {
+ RegistersCache c = (RegistersCache)dmc.registers_cache;
+ if (c != null) {
+ c.dispose();
+ dmc.registers_cache = null;
+ getSession().dispatchEvent(new GroupsChangedEvent(dmc), getProperties());
+ }
+ }
+ }
+
+ public void registerChanged(String id) {
+ ObjectDMC dmc = model.get(id);
+ if (dmc != null) {
+ for (ValueDMC val : dmc.values.values()) val.cache.reset();
+ dmc.children.invalidateRegContents();
+ if (dmc instanceof RegisterGroupDMC) {
+ getSession().dispatchEvent(new RegisterGroupChangedEvent((RegisterGroupDMC)dmc), getProperties());
+ }
+ else if (dmc instanceof RegisterDMC) {
+ getSession().dispatchEvent(new RegisterChangedEvent((RegisterDMC)dmc), getProperties());
+ }
+ else if (dmc instanceof BitFieldDMC) {
+ getSession().dispatchEvent(new BitFieldChangedEvent((BitFieldDMC)dmc), getProperties());
+ }
+ }
+ }
+ };
+
+ private final IChannel channel;
+ private final com.windriver.tcf.api.services.IRegisters tcf_reg_service;
+ private final Map<String,ObjectDMC> model;
+
+ public TCFDSFRegisters(DsfSession session, IChannel channel, final RequestMonitor monitor) {
+ super(session);
+ this.channel = channel;
+ model = new HashMap<String,ObjectDMC>();
+ tcf_reg_service = channel.getRemoteService(com.windriver.tcf.api.services.IRegisters.class);
+ if (tcf_reg_service != null) tcf_reg_service.addListener(listener);
+ initialize(new RequestMonitor(getExecutor(), monitor) {
+ @Override
+ protected void handleOK() {
+ String[] class_names = {
+ org.eclipse.dd.dsf.debug.service.IRegisters.class.getName(),
+ TCFDSFRegisters.class.getName()
+ };
+ register(class_names, new Hashtable<String,String>());
+ getSession().addServiceEventListener(TCFDSFRegisters.this, null);
+ monitor.done();
+ }
+ });
+ }
+
+ @Override
+ public void shutdown(RequestMonitor monitor) {
+ getSession().removeServiceEventListener(this);
+ unregister();
+ super.shutdown(monitor);
+ }
+
+ @Override
+ protected BundleContext getBundleContext() {
+ return Activator.getBundleContext();
+ }
+
+ public void getRegisterGroupData(IRegisterGroupDMContext dmc, DataRequestMonitor<IRegisterGroupDMData> rm) {
+ if (tcf_reg_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Registers service is not available", null)); //$NON-NLS-1$
+ }
+ else if (dmc instanceof RegisterGroupDMC) {
+ if (((ObjectDMC)dmc).disposed) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ }
+ else {
+ rm.setData(new RegisterGroupData(((RegisterGroupDMC)dmc).context));
+ }
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+
+ public void getRegisterData(IRegisterDMContext dmc, DataRequestMonitor<IRegisterDMData> rm) {
+ if (tcf_reg_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Registers service is not available", null)); //$NON-NLS-1$
+ }
+ else if (dmc instanceof RegisterDMC) {
+ if (((ObjectDMC)dmc).disposed) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ }
+ else {
+ rm.setData(new RegisterData(((RegisterDMC)dmc).context));
+ }
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+
+ public void getBitFieldData(IBitFieldDMContext dmc, DataRequestMonitor<IBitFieldDMData> rm) {
+ if (tcf_reg_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Registers service is not available", null)); //$NON-NLS-1$
+ }
+ else if (dmc instanceof BitFieldDMC) {
+ if (((ObjectDMC)dmc).disposed) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ }
+ else {
+ rm.setData(new BitFieldData(((BitFieldDMC)dmc).context));
+ }
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+
+ public void getRegisterGroups(final IDMContext dmc, final DataRequestMonitor<IRegisterGroupDMContext[]> rm) {
+ if (rm.isCanceled()) return;
+ RegistersCache cache = null;
+ if (tcf_reg_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Registers service is not available", null)); //$NON-NLS-1$
+ }
+ else if (dmc instanceof TCFDSFExecutionDMC) {
+ TCFDSFExecutionDMC exe = (TCFDSFExecutionDMC)dmc;
+ if (exe.registers_cache == null) exe.registers_cache =
+ new RegistersCache(channel, exe.getTcfContextId(), new IDMContext[]{ exe });
+ cache = (RegistersCache)exe.registers_cache;
+ }
+ else if (dmc instanceof ObjectDMC) {
+ if (((ObjectDMC)dmc).disposed) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ cache = ((ObjectDMC)dmc).children;
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ if (cache != null) {
+ if (!cache.validate()) {
+ cache.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ getRegisterGroups(dmc, rm);
+ }
+ });
+ return;
+ }
+ if (cache.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", cache.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ Map<String,ObjectDMC> c = cache.getData();
+ int cnt = 0;
+ for (IDMContext x : c.values()) {
+ if (x instanceof RegisterGroupDMC) cnt++;
+ }
+ if (cnt == 0 && c.size() > 0 && dmc instanceof TCFDSFExecutionDMC) {
+ // TODO DSF requires at least one group
+ RegisterGroupDMC[] arr = new RegisterGroupDMC[1];
+ arr[0] = new RegisterGroupDMC(getSession().getId(), cache.parents, cache.id, cache);
+ rm.setData(arr);
+ }
+ else {
+ RegisterGroupDMC[] arr = new RegisterGroupDMC[cnt];
+ cnt = 0;
+ for (IDMContext x : c.values()) {
+ if (x instanceof RegisterGroupDMC) arr[cnt++] = (RegisterGroupDMC)x;
+ }
+ rm.setData(arr);
+ }
+ }
+ rm.done();
+ }
+
+ public void getRegisterSubGroups(IDMContext dmc, DataRequestMonitor<IRegisterGroupDMContext[]> rm) {
+ getRegisterGroups(dmc, rm);
+ }
+
+ public void getRegisters(final IDMContext dmc, final DataRequestMonitor<IRegisterDMContext[]> rm) {
+ if (rm.isCanceled()) return;
+ RegistersCache cache = null;
+ if (tcf_reg_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Registers service is not available", null)); //$NON-NLS-1$
+ }
+ else if (dmc instanceof TCFDSFExecutionDMC) {
+ TCFDSFExecutionDMC exe = (TCFDSFExecutionDMC)dmc;
+ if (exe.registers_cache == null) exe.registers_cache =
+ new RegistersCache(channel, exe.getTcfContextId(), new IDMContext[]{ exe });
+ cache = (RegistersCache)exe.registers_cache;
+ }
+ else if (dmc instanceof ObjectDMC) {
+ if (((ObjectDMC)dmc).disposed) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ cache = ((ObjectDMC)dmc).children;
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ if (cache != null) {
+ if (!cache.validate()) {
+ cache.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ getRegisters(dmc, rm);
+ }
+ });
+ return;
+ }
+ if (cache.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", cache.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ Map<String,ObjectDMC> c = cache.getData();
+ int cnt = 0;
+ for (IDMContext x : c.values()) {
+ if (x instanceof RegisterDMC) cnt++;
+ }
+ RegisterDMC[] arr = new RegisterDMC[cnt];
+ cnt = 0;
+ for (IDMContext x : c.values()) {
+ if (x instanceof RegisterDMC) arr[cnt++] = (RegisterDMC)x;
+ }
+ rm.setData(arr);
+ }
+ rm.done();
+ }
+
+ public void getBitFields(final IDMContext dmc, final DataRequestMonitor<IBitFieldDMContext[]> rm) {
+ if (rm.isCanceled()) return;
+ if (tcf_reg_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Registers service is not available", null)); //$NON-NLS-1$
+ }
+ else if (dmc instanceof ObjectDMC) {
+ if (((ObjectDMC)dmc).disposed) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ RegistersCache cache = ((ObjectDMC)dmc).children;
+ if (!cache.validate()) {
+ cache.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ getBitFields(dmc, rm);
+ }
+ });
+ return;
+ }
+ if (cache.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", cache.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ Map<String,ObjectDMC> c = cache.getData();
+ int cnt = 0;
+ for (IDMContext x : c.values()) {
+ if (x instanceof BitFieldDMC) cnt++;
+ }
+ BitFieldDMC[] arr = new BitFieldDMC[cnt];
+ cnt = 0;
+ for (IDMContext x : c.values()) {
+ if (x instanceof BitFieldDMC) arr[cnt++] = (BitFieldDMC)x;
+ }
+ rm.setData(arr);
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+
+ public void writeBitField(IDMContext dmc, String val, String fmt, final RequestMonitor rm) {
+ if (tcf_reg_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Registers service is not available", null)); //$NON-NLS-1$
+ }
+ else if (dmc instanceof ObjectDMC) {
+ if (((ObjectDMC)dmc).disposed) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ ((ObjectDMC)dmc).context.set(fmt, val, new com.windriver.tcf.api.services.IRegisters.DoneSet() {
+ public void doneSet(IToken token, Exception error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+ });
+ return;
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+
+ public void writeBitField(IDMContext dmc, IMnemonic mnemonic, final RequestMonitor rm) {
+ if (tcf_reg_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Registers service is not available", null)); //$NON-NLS-1$
+ }
+ else if (dmc instanceof ObjectDMC) {
+ if (((ObjectDMC)dmc).disposed) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ NamedValue[] arr = ((ObjectDMC)dmc).context.getNamedValues();
+ if (arr != null) {
+ for (NamedValue nv : arr) {
+ if (nv.getName().equals(mnemonic.getShortName())) {
+ String fmt = com.windriver.tcf.api.services.IRegisters.FORMAT_DECIMAL;
+ String val = nv.getValue().toString();
+ ((ObjectDMC)dmc).context.set(fmt, val, new com.windriver.tcf.api.services.IRegisters.DoneSet() {
+ public void doneSet(IToken token, Exception error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+ });
+ return;
+ }
+ }
+ }
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown mnemonic", null)); //$NON-NLS-1$
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+
+ public void writeRegister(IDMContext dmc, String val, String fmt, RequestMonitor rm) {
+ writeBitField(dmc, val, fmt, rm);
+ }
+
+ public void getAvailableFormats(IFormattedDataDMContext dmc, DataRequestMonitor<String[]> rm) {
+ if (tcf_reg_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Registers service is not available", null)); //$NON-NLS-1$
+ }
+ else if (dmc instanceof ObjectDMC) {
+ rm.setData(((ObjectDMC)dmc).context.getAvailableFormats());
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+
+ public void getFormattedExpressionValue(final FormattedValueDMContext dmc,
+ final DataRequestMonitor<FormattedValueDMData> rm) {
+ if (rm.isCanceled()) return;
+ if (dmc instanceof ValueDMC) {
+ ValueDMC vmc = (ValueDMC)dmc;
+ if (vmc.disposed) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ if (!vmc.cache.validate()) {
+ vmc.cache.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ getFormattedExpressionValue(dmc, rm);
+ }
+ });
+ return;
+ }
+ if (vmc.cache.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", vmc.cache.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ rm.setData(vmc.cache.getData());
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+
+ public FormattedValueDMContext getFormattedValueContext(IFormattedDataDMContext dmc, String fmt) {
+ if (dmc instanceof ObjectDMC) {
+ ObjectDMC omc = (ObjectDMC)dmc;
+ ValueDMC res = omc.values.get(fmt);
+ if (res == null) {
+ omc.values.put(fmt, res = new ValueDMC(omc, fmt));
+ }
+ return res;
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void getModelData(IDMContext dmc, DataRequestMonitor<?> rm) {
+ if (dmc instanceof RegisterGroupDMC) {
+ getRegisterGroupData((RegisterGroupDMC)dmc, (DataRequestMonitor<IRegisterGroupDMData>)rm);
+ }
+ else if (dmc instanceof RegisterDMC) {
+ getRegisterData((RegisterDMC)dmc, (DataRequestMonitor<IRegisterDMData>)rm);
+ }
+ else if (dmc instanceof BitFieldDMC) {
+ getBitFieldData((BitFieldDMC)dmc, (DataRequestMonitor<IBitFieldDMData>)rm);
+ }
+ else if (dmc instanceof FormattedValueDMContext) {
+ getFormattedExpressionValue((FormattedValueDMContext)dmc, (DataRequestMonitor<FormattedValueDMData>)rm);
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(org.eclipse.dd.dsf.debug.service.IRunControl.IResumedDMEvent e) {
+ if (e.getReason() != StateChangeReason.STEP) {
+ RegistersCache cache = (RegistersCache)((TCFDSFExecutionDMC)e.getDMContext()).registers_cache;
+ if (cache != null) cache.invalidateRegContents();
+ }
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent e) {
+ RegistersCache cache = (RegistersCache)((TCFDSFExecutionDMC)e.getDMContext()).registers_cache;
+ if (cache != null) cache.invalidateRegContents();
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(org.eclipse.dd.dsf.debug.service.IRunControl.IExitedDMEvent e) {
+ RegistersCache cache = (RegistersCache)((TCFDSFExecutionDMC)e.getExecutionContext()).registers_cache;
+ if (cache != null) cache.dispose();
+ }
+}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFRunControl.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFRunControl.java
index 3564e25cf..6bfc207a0 100644
--- a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFRunControl.java
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFRunControl.java
@@ -10,12 +10,14 @@
*******************************************************************************/
package com.windriver.tcf.dsf.core.services;
+import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
+import java.util.Set;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
@@ -24,21 +26,25 @@ import org.eclipse.dd.dsf.concurrent.RequestMonitor;
import org.eclipse.dd.dsf.datamodel.AbstractDMEvent;
import org.eclipse.dd.dsf.datamodel.IDMContext;
import org.eclipse.dd.dsf.datamodel.ServiceDMContext;
+import org.eclipse.dd.dsf.debug.model.DsfMemoryBlockRetrieval;
import org.eclipse.dd.dsf.service.AbstractDsfService;
import org.eclipse.dd.dsf.service.DsfSession;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
+import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension;
import org.osgi.framework.BundleContext;
+import com.windriver.debug.tcf.core.model.ITCFConstants;
import com.windriver.tcf.dsf.core.Activator;
import com.windriver.tcf.api.protocol.IChannel;
import com.windriver.tcf.api.protocol.IToken;
-import com.windriver.tcf.api.protocol.Protocol;
import com.windriver.tcf.api.services.IRunControl;
import com.windriver.tcf.api.services.IRunControl.RunControlContext;
public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.dd.dsf.debug.service.IRunControl {
-
+
public static class SuspendedEvent extends AbstractDMEvent<IExecutionDMContext> implements ISuspendedDMEvent {
-
+
private final StateChangeReason reason;
public SuspendedEvent(IExecutionDMContext dmc, String reason) {
@@ -74,7 +80,7 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
}
public IExecutionDMContext getTriggeringContext() {
- return model.get(trigger_id);
+ return cache.get(trigger_id);
}
public StateChangeReason getReason() {
@@ -87,14 +93,14 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
public ContainerResumedEvent(IExecutionDMContext dmc) {
super(dmc);
}
-
+
public StateChangeReason getReason() {
return StateChangeReason.USER_REQUEST;
}
}
public static class StartedEvent extends AbstractDMEvent<IContainerDMContext> implements IStartedDMEvent {
-
+
private final IExecutionDMContext exe;
public StartedEvent(IContainerDMContext dmc, IExecutionDMContext exe) {
@@ -127,19 +133,22 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
return exe;
}
}
-
+
private final com.windriver.tcf.api.services.IRunControl.RunControlListener run_listener =
- new com.windriver.tcf.api.services.IRunControl.RunControlListener() {
+ new com.windriver.tcf.api.services.IRunControl.RunControlListener() {
public void containerResumed(String[] context_ids) {
for (String id : context_ids) {
- ExecutionDMC n = model.get(id);
+ ExecutionDMC n = cache.get(id);
if (n != null) n.onContextResumed();
}
for (String id : context_ids) {
- ExecutionDMC n = model.get(id);
- if (n != null && n.ctx.isContainer()) {
- getSession().dispatchEvent(new ContainerResumedEvent(n), getProperties());
+ ExecutionDMC n = cache.get(id);
+ if (n != null && n.context.isValid()) {
+ RunControlContext c = n.context.getData();
+ if (c.isContainer()) {
+ getSession().dispatchEvent(new ContainerResumedEvent(n), getProperties());
+ }
}
}
}
@@ -148,98 +157,196 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
String reason, Map<String, Object> params,
String[] suspended_ids) {
if (trigger_id != null) {
- ExecutionDMC n = model.get(trigger_id);
+ ExecutionDMC n = cache.get(trigger_id);
if (n != null) n.onContextSuspended(pc, reason, params);
}
for (String id : suspended_ids) {
if (id.equals(trigger_id)) continue;
- ExecutionDMC n = model.get(id);
+ ExecutionDMC n = cache.get(id);
if (n != null) n.onContainerSuspended(reason);
}
for (String id : suspended_ids) {
- ExecutionDMC n = model.get(id);
- if (n != null && n.ctx.isContainer()) {
- getSession().dispatchEvent(new ContainerSuspendedEvent(n, trigger_id, reason), getProperties());
+ ExecutionDMC n = cache.get(id);
+ if (n != null && n.context.isValid()) {
+ RunControlContext c = n.context.getData();
+ if (c.isContainer()) {
+ getSession().dispatchEvent(new ContainerSuspendedEvent(n, trigger_id, reason), getProperties());
+ }
}
}
}
public void contextAdded(RunControlContext[] contexts) {
for (RunControlContext ctx : contexts) {
- ExecutionDMC n = model.get(ctx.getParentID());
+ ExecutionDMC n = cache.get(ctx.getParentID());
if (n != null) n.onContextAdded(ctx);
}
}
public void contextChanged(RunControlContext[] contexts) {
for (RunControlContext ctx : contexts) {
- ExecutionDMC n = model.get(ctx.getID());
+ ExecutionDMC n = cache.get(ctx.getID());
if (n != null) n.onContextChanged(ctx);
}
}
public void contextException(String id, String msg) {
- ExecutionDMC n = model.get(id);
+ ExecutionDMC n = cache.get(id);
if (n != null) n.onContextException(msg);
}
public void contextRemoved(String[] context_ids) {
for (String id : context_ids) {
- ExecutionDMC n = model.get(id);
+ ExecutionDMC n = cache.get(id);
if (n != null) n.onContextRemoved();
}
}
public void contextResumed(String id) {
- ExecutionDMC n = model.get(id);
+ ExecutionDMC n = cache.get(id);
if (n != null) n.onContextResumed();
}
public void contextSuspended(String id, String pc, String reason, Map<String, Object> params) {
- ExecutionDMC n = model.get(id);
+ ExecutionDMC n = cache.get(id);
if (n != null) n.onContextSuspended(pc, reason, params);
}
};
- private interface IDataRequest {
- void cancel();
- void done();
+ private static class ExecutionState {
+ boolean is_suspended;
+ boolean is_running;
+ String suspend_pc;
+ String suspend_reason;
+ Map<String,Object> suspend_params;
}
- private static final int
- VALID_CHILDREN = 4,
- VALID_CONTEXT = 8,
- VALID_STATE = 16,
- VALID_ALL = VALID_CHILDREN | VALID_CONTEXT | VALID_STATE;
-
private class ExecutionDMC extends TCFDSFExecutionDMC {
-
+
final String id;
final ExecutionDMC parent;
-
- final SortedMap<String,ExecutionDMC> children = new TreeMap<String,ExecutionDMC>();
- final Map<String,ExecutionDMC> children_next = new HashMap<String,ExecutionDMC>();
- final Collection<IDataRequest> node_wait_list = new ArrayList<IDataRequest>();
-
- int valid;
- Throwable error;
+ final IMemoryBlockRetrievalExtension mem_retrieval;
+
boolean disposed;
- IToken command;
-
- RunControlContext ctx;
int is_stepping;
int is_resuming;
- boolean is_suspended;
- boolean is_running;
- String suspend_pc;
- String suspend_reason;
- String exception_msg;
- Map<String,Object> suspend_params;
-
- public ExecutionDMC(ExecutionDMC parent, String id) {
- super(TCFDSFRunControl.this, parent == null ? null : new IDMContext[] { parent });
+
+ final TCFDataCache<RunControlContext> context;
+ final TCFDataCache<Map<String,ExecutionDMC>> children;
+ final TCFDataCache<ExecutionState> state;
+
+ public ExecutionDMC(ExecutionDMC parent, final String id) {
+ super(TCFDSFRunControl.this, parent == null ?
+ new IDMContext[0] : new IDMContext[] { parent });
this.parent = parent;
this.id = id;
+ DsfMemoryBlockRetrieval mr = null;
+ try {
+ mr = new DsfMemoryBlockRetrieval(ITCFConstants.ID_TCF_DEBUG_MODEL, this);
+ }
+ catch (DebugException e) {
+ e.printStackTrace();
+ };
+ mem_retrieval = mr;
+ context = new TCFDataCache<RunControlContext>(channel) {
+ @Override
+ public boolean startDataRetrieval() {
+ assert command == null;
+ if (id == null || tcf_run_service == null) {
+ data = null;
+ valid = true;
+ return true;
+ }
+ command = tcf_run_service.getContext(id, new IRunControl.DoneGetContext() {
+ public void doneGetContext(IToken token, Exception err, IRunControl.RunControlContext ctx) {
+ if (command != token) return;
+ command = null;
+ if (err != null) {
+ error = err;
+ }
+ else {
+ data = ctx;
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+ };
+ children = new TCFDataCache<Map<String,ExecutionDMC>>(channel) {
+ @Override
+ public boolean startDataRetrieval() {
+ assert command == null;
+ if (tcf_run_service == null) {
+ data = null;
+ valid = true;
+ return true;
+ }
+ command = tcf_run_service.getChildren(id, new IRunControl.DoneGetChildren() {
+ public void doneGetChildren(IToken token, Exception err, String[] contexts) {
+ if (command != token) return;
+ command = null;
+ if (err != null) {
+ data = null;
+ error = err;
+ }
+ else {
+ if (data == null) data = new HashMap<String,ExecutionDMC>();
+ data.clear();
+ for (int i = 0; i < contexts.length; i++) {
+ String id = contexts[i];
+ ExecutionDMC n = cache.get(id);
+ if (n == null) {
+ n = new ExecutionDMC(ExecutionDMC.this, id);
+ cache.put(n.id, n);
+ }
+ data.put(id, n);
+ }
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+ };
+ state = new TCFDataCache<ExecutionState>(channel) {
+ @Override
+ public boolean startDataRetrieval() {
+ assert command == null;
+ assert context.isValid();
+ RunControlContext c = context.getData();
+ if (c == null || !c.hasState()) {
+ data = null;
+ valid = true;
+ return true;
+ }
+ command = c.getState(new IRunControl.DoneGetState() {
+ public void doneGetState(IToken token, Exception err, boolean suspend, String pc, String reason, Map<String,Object> params) {
+ if (token != command) return;
+ command = null;
+ if (err != null) {
+ data = null;
+ error = err;
+ }
+ else {
+ data = new ExecutionState();
+ data.is_running = !suspend;
+ data.is_suspended = suspend;
+ if (suspend) {
+ data.suspend_pc = pc;
+ data.suspend_reason = reason;
+ data.suspend_params = params;
+ }
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+ };
}
@Override
@@ -249,287 +356,153 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
@Override
public boolean equals(Object obj) {
- return super.baseEquals(obj) && ((ExecutionDMC)obj).id.equals(id);
+ if (!super.baseEquals(obj)) return false;
+ String obj_id = ((ExecutionDMC)obj).id;
+ if (obj_id == null) return id == null;
+ return obj_id.equals(id);
}
-
+
@Override
public int hashCode() {
+ if (id == null) return 0;
return id.hashCode();
}
@Override
+ @SuppressWarnings("unchecked")
+ public Object getAdapter(Class cls) {
+ Object obj = null;
+ if (cls == IMemoryBlockRetrieval.class) obj = mem_retrieval;
+ if (cls == IMemoryBlockRetrievalExtension.class) obj = mem_retrieval;
+ if (obj == null) obj = super.getAdapter(cls);
+ return obj;
+ }
+
+ @Override
public String getTcfContextId() {
return id;
}
+
+ @Override
+ public void addStateWaitingRequest(IDataRequest req) {
+ state.addWaitingRequest(req);
+ }
+
+ @Override
+ public TCFAddress getPC() {
+ ExecutionState st = state.getData();
+ if (st == null) return null;
+ if (st.suspend_pc == null) return null;
+ return new TCFAddress(new BigInteger(st.suspend_pc));
+ }
+
+ @Override
+ public boolean validateState() {
+ return state.validate();
+ }
+
+ @Override
+ public boolean isDisposed() {
+ return disposed;
+ }
void dispose() {
assert !disposed;
- ExecutionDMC arr[] = children.values().toArray(new ExecutionDMC[children.size()]);
- for (int i = 0; i < arr.length; i++) arr[i].dispose();
- assert children.isEmpty();
- if (parent != null) {
- parent.children.remove(id);
- parent.children_next.remove(id);
- }
- model.remove(id);
- disposed = true;
- }
-
- void invalidateDMC(int flags) {
- // cancel current data retrieval command
- if (command != null) {
- command.cancel();
- command = null;
- }
-
- // cancel waiting requests
- if (!node_wait_list.isEmpty()) {
- IDataRequest[] arr = node_wait_list.toArray(new IDataRequest[node_wait_list.size()]);
- node_wait_list.clear();
- for (IDataRequest r : arr) r.cancel();
- }
-
- if ((flags & VALID_STATE) != 0) {
- is_suspended = false;
- is_running = false;
- }
-
- if ((flags & VALID_CHILDREN) != 0) {
- children_next.clear();
- for (ExecutionDMC n : children.values()) n.invalidateDMC(VALID_ALL);
- }
-
- if (flags == VALID_ALL) {
- error = null;
- }
-
- valid &= ~flags;
- }
-
- boolean validateDMC(IDataRequest done) {
- assert Protocol.isDispatchThread();
- assert (valid & ~VALID_ALL) == 0;
- assert parent == null || parent.children.get(id) == model.get(id);
- if (channel.getState() != IChannel.STATE_OPEN) {
- children_next.clear();
- error = null;
- command = null;
- valid = VALID_ALL;
- }
- if (command != null) {
- if (done != null) node_wait_list.add(done);
- return false;
- }
- if (parent != null && parent.error != null) {
- valid = VALID_ALL;
- }
- if ((valid & VALID_CONTEXT) == 0 && !validateRunControlContext(done)) return false;
- if ((valid & VALID_STATE) == 0 && !validateRunControlState(done)) return false;
- if ((valid & VALID_CHILDREN) == 0 && !validateRunControlChildren(done)) return false;
- assert valid == VALID_ALL;
- assert command == null;
- ExecutionDMC[] a = children.values().toArray(new ExecutionDMC[children.size()]);
- for (ExecutionDMC n : a) {
- if (children_next.get(n.id) == null) n.dispose();
- }
- for (ExecutionDMC n : children_next.values()) {
- if (children.get(n.id) == null) {
- children.put(n.id, n);
- model.put(n.id, n);
+ context.cancel();
+ children.cancel();
+ state.cancel();
+ if (children.isValid()) {
+ Map<String,ExecutionDMC> m = children.getData();
+ if (m != null) {
+ for (ExecutionDMC n : m.values()) n.dispose();
}
}
- if (!node_wait_list.isEmpty()) {
- IDataRequest[] arr = node_wait_list.toArray(new IDataRequest[node_wait_list.size()]);
- node_wait_list.clear();
- for (IDataRequest r : arr) r.done();
- }
- assert valid == VALID_ALL;
- return true;
- }
-
- private boolean validateRunControlChildren(IDataRequest done) {
- assert command == null;
- if (tcf_run_service == null) {
- valid |= VALID_CHILDREN;
- return true;
- }
- if (done != null) node_wait_list.add(done);
- command = tcf_run_service.getChildren(id, new IRunControl.DoneGetChildren() {
- public void doneGetChildren(IToken token, Exception error, String[] contexts) {
- if (command != token) return;
- command = null;
- if (error != null) {
- ExecutionDMC.this.error = error;
- }
- else {
- for (int i = 0; i < contexts.length; i++) {
- String id = contexts[i];
- ExecutionDMC node = model.get(id);
- if (node == null) node = new ExecutionDMC(ExecutionDMC.this, id);
- children_next.put(id, node);
- }
- }
- valid |= VALID_CHILDREN;
- validateDMC(null);
- }
- });
- return false;
- }
-
- private boolean validateRunControlContext(IDataRequest done) {
- assert command == null;
- if (tcf_run_service == null) {
- valid |= VALID_CONTEXT;
- return true;
- }
- if (done != null) node_wait_list.add(done);
- command = tcf_run_service.getContext(id, new IRunControl.DoneGetContext() {
- public void doneGetContext(IToken token, Exception error, IRunControl.RunControlContext ctx) {
- if (command != token) return;
- command = null;
- if (error != null) {
- ExecutionDMC.this.error = error;
- }
- else {
- ExecutionDMC.this.ctx = ctx;
- }
- valid |= VALID_CONTEXT;
- validateDMC(null);
- }
- });
- return false;
- }
-
- private boolean validateRunControlState(IDataRequest done) {
- assert command == null;
- if (ctx == null) {
- valid |= VALID_STATE;
- return true;
- }
- if (error != null || !ctx.hasState()) {
- is_running = false;
- is_suspended = false;
- suspend_pc = null;
- suspend_reason = null;
- suspend_params = null;
- valid |= VALID_STATE;
- return true;
- }
- if (done != null) node_wait_list.add(done);
- command = ctx.getState(new IRunControl.DoneGetState() {
- public void doneGetState(IToken token, Exception error, boolean suspend, String pc, String reason, Map<String,Object> params) {
- if (token != command) return;
- command = null;
- if (error != null) {
- is_running = false;
- is_suspended = false;
- suspend_pc = null;
- suspend_reason = null;
- suspend_params = null;
- ExecutionDMC.this.error = error;
- }
- else {
- is_running = !suspend;
- is_suspended = suspend;
- if (suspend) {
- suspend_pc = pc;
- suspend_reason = reason;
- suspend_params = params;
- }
- else {
- suspend_pc = null;
- suspend_reason = null;
- suspend_params = null;
- }
- }
- valid |= VALID_STATE;
- validateDMC(null);
- }
- });
- return false;
+ cache.remove(id);
+ disposed = true;
}
/*--------------------------------------------------------------------------------------*/
/* Events */
- void onContextAdded(IRunControl.RunControlContext context) {
- String id = context.getID();
+ void onContextAdded(IRunControl.RunControlContext c) {
+ String id = c.getID();
assert !disposed;
- assert children.get(id) == null;
+ assert cache.get(id) == null;
ExecutionDMC n = new ExecutionDMC(this, id);
- n.ctx = context;
- n.valid |= VALID_CONTEXT;
- children.put(id, n);
- model.put(id, n);
+ n.context.reset(c);
+ if (children.isValid()) {
+ Map<String,ExecutionDMC> m = children.getData();
+ if (m != null) m.put(id, n);
+ }
+ cache.put(id, n);
getSession().dispatchEvent(new StartedEvent(this, n), getProperties());
}
- void onContextChanged(IRunControl.RunControlContext context) {
+ void onContextChanged(IRunControl.RunControlContext c) {
assert !disposed;
- ctx = context;
- invalidateDMC(VALID_CHILDREN);
+ context.reset(c);
getSession().dispatchEvent(new ChangedEvent(this), getProperties());
}
void onContextRemoved() {
assert !disposed;
+ if (parent != null && parent.children.isValid()) {
+ Map<String,ExecutionDMC> m = parent.children.getData();
+ if (m != null) m.remove(id);
+ }
dispose();
getSession().dispatchEvent(new ExitedEvent(parent, this), getProperties());
}
void onContainerSuspended(String reason) {
assert !disposed;
- if (ctx == null) return;
- if (!ctx.hasState()) return;
- invalidateDMC(VALID_STATE);
+ if (!context.isValid()) return;
+ RunControlContext rc = context.getData();
+ if (rc == null) return;
+ if (!rc.hasState()) return;
+ state.reset();
getSession().dispatchEvent(new SuspendedEvent(this, reason), getProperties());
}
void onContextSuspended(String pc, String reason, Map<String,Object> params) {
assert !disposed;
- if (ctx == null) return;
- assert ctx.hasState();
- is_suspended = true;
- suspend_pc = pc;
- suspend_reason = reason;
- suspend_params = params;
- is_running = false;
- valid |= VALID_STATE;
+ assert !context.isValid() || context.getData().hasState();
+ ExecutionState st = new ExecutionState();
+ st.is_suspended = true;
+ st.suspend_pc = pc;
+ st.suspend_reason = reason;
+ st.suspend_params = params;
+ state.reset(st);
getSession().dispatchEvent(new SuspendedEvent(this, reason), getProperties());
}
void onContextResumed() {
assert !disposed;
- if (ctx == null) return;
- assert ctx.hasState();
- exception_msg = null;
- is_suspended = false;
- suspend_pc = null;
- suspend_reason = null;
- suspend_params = null;
- is_running = true;
- valid |= VALID_STATE;
+ assert !context.isValid() || context.getData().hasState();
+ ExecutionState st = new ExecutionState();
+ st.is_running = true;
+ state.reset(st);
getSession().dispatchEvent(new ResumedEvent(this), getProperties());
}
void onContextException(String msg) {
assert !disposed;
- exception_msg = msg;
+ // TODO onContextException handling
}
}
-
+
private static class ExecutionData implements IExecutionDMData {
-
+
private final StateChangeReason reason;
-
+
ExecutionData(StateChangeReason reason) {
this.reason = reason;
}
-
+
public boolean isValid() {
return true;
}
-
+
public StateChangeReason getStateChangeReason() {
return reason;
}
@@ -548,18 +521,39 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
if (s.equals(com.windriver.tcf.api.services.IRunControl.REASON_ERROR)) return StateChangeReason.ERROR;
return StateChangeReason.UNKNOWN;
}
-
+
private final IChannel channel;
private final com.windriver.tcf.api.services.IRunControl tcf_run_service;
- private final Map<String,ExecutionDMC> model = new HashMap<String,ExecutionDMC>();
+ private final Map<String,ExecutionDMC> cache = new HashMap<String,ExecutionDMC>();
+ private final ExecutionDMC root_dmc;
private IDMContext service_dmc;
- public TCFDSFRunControl(DsfSession session, IChannel channel) {
+ public TCFDSFRunControl(DsfSession session, IChannel channel, final RequestMonitor monitor) {
super(session);
this.channel = channel;
tcf_run_service = channel.getRemoteService(com.windriver.tcf.api.services.IRunControl.class);
if (tcf_run_service != null) tcf_run_service.addListener(run_listener);
service_dmc = new ServiceDMContext(this, "#run_control");
+ root_dmc = new ExecutionDMC(null, null);
+ cache.put(null, root_dmc);
+ initialize(new RequestMonitor(getExecutor(), monitor) {
+ @Override
+ protected void handleOK() {
+ String[] class_names = {
+ org.eclipse.dd.dsf.debug.service.IRunControl.class.getName(),
+ TCFDSFRunControl.class.getName()
+ };
+ register(class_names, new Hashtable<String,String>());
+ monitor.done();
+ }
+ });
+ }
+
+ @Override
+ public void shutdown(RequestMonitor monitor) {
+ if (tcf_run_service != null) tcf_run_service.removeListener(run_listener);
+ unregister();
+ super.shutdown(monitor);
}
@Override
@@ -571,27 +565,67 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
public void getModelData(IDMContext dmc, final DataRequestMonitor<?> rm) {
if (dmc instanceof ExecutionDMC) {
final ExecutionDMC ctx = (ExecutionDMC)dmc;
- IDataRequest done = new IDataRequest() {
-
- public void cancel() {
- rm.setCanceled(true);
- rm.done();
- }
-
- @SuppressWarnings("unchecked")
- public void done() {
- if (ctx.error != null) {
- rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- REQUEST_FAILED, "Data error", ctx.error)); //$NON-NLS-1$
+ if (!ctx.context.validate()) {
+ ctx.context.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
}
- else {
- ExecutionData dt = new ExecutionData(toStateChangeReason(ctx.suspend_reason));
- ((DataRequestMonitor<IExecutionDMData>)rm).setData(dt);
+ public void done() {
+ getModelData(ctx, rm);
}
- rm.done();
- }
- };
- if (ctx.validateDMC(done)) done.done();
+ });
+ return;
+ }
+ if (ctx.context.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", ctx.context.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ if (ctx.context.getData() == null) {
+ ExecutionData dt = new ExecutionData(StateChangeReason.UNKNOWN);
+ ((DataRequestMonitor<IExecutionDMData>)rm).setData(dt);
+ rm.done();
+ return;
+ }
+ if (!ctx.context.getData().hasState()) {
+ ExecutionData dt = new ExecutionData(StateChangeReason.UNKNOWN);
+ ((DataRequestMonitor<IExecutionDMData>)rm).setData(dt);
+ rm.done();
+ return;
+ }
+ if (!ctx.state.validate()) {
+ ctx.state.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ getModelData(ctx, rm);
+ }
+ });
+ return;
+ }
+ if (ctx.state.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", ctx.state.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ if (ctx.state.getData() == null) {
+ ExecutionData dt = new ExecutionData(StateChangeReason.UNKNOWN);
+ ((DataRequestMonitor<IExecutionDMData>)rm).setData(dt);
+ rm.done();
+ return;
+ }
+ ExecutionData dt = new ExecutionData(toStateChangeReason(ctx.state.getData().suspend_reason));
+ ((DataRequestMonitor<IExecutionDMData>)rm).setData(dt);
+ rm.done();
}
else if (dmc == service_dmc) {
((DataRequestMonitor<TCFDSFRunControl>)rm).setData(this);
@@ -611,68 +645,135 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
public boolean isValid() {
return true;
}
-
- public IContainerDMContext getContainerDMC() {
- // TODO: getContainerDMC()
- assert false;
- return null;
- }
public boolean canInstructionStep(IDMContext context) {
if (context instanceof ExecutionDMC) {
- ExecutionDMC x = (ExecutionDMC)context;
- return x.ctx.canResume(com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO);
+ ExecutionDMC ctx = (ExecutionDMC)context;
+ if (ctx.context.isValid()) {
+ RunControlContext c = ctx.context.getData();
+ return c != null && c.canResume(com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO);
+ }
}
return false;
}
public boolean canResume(IDMContext context) {
if (context instanceof ExecutionDMC) {
- ExecutionDMC x = (ExecutionDMC)context;
- return x.ctx.canResume(com.windriver.tcf.api.services.IRunControl.RM_RESUME);
+ ExecutionDMC ctx = (ExecutionDMC)context;
+ if (ctx.context.isValid()) {
+ RunControlContext c = ctx.context.getData();
+ return c != null && c.canResume(com.windriver.tcf.api.services.IRunControl.RM_RESUME);
+ }
}
return false;
}
public boolean canStep(IDMContext context) {
if (context instanceof ExecutionDMC) {
- ExecutionDMC x = (ExecutionDMC)context;
- return x.ctx.canResume(com.windriver.tcf.api.services.IRunControl.RM_STEP_OVER);
+ ExecutionDMC ctx = (ExecutionDMC)context;
+ if (ctx.context.isValid()) {
+ RunControlContext c = ctx.context.getData();
+ if (c != null) {
+ if (c.canResume(com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO_LINE)) return true;
+ if (c.canResume(com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO)) return true;
+ }
+ }
}
return false;
}
public boolean canSuspend(IDMContext context) {
if (context instanceof ExecutionDMC) {
- ExecutionDMC x = (ExecutionDMC)context;
- return x.ctx.canSuspend();
+ ExecutionDMC ctx = (ExecutionDMC)context;
+ if (ctx.context.isValid()) {
+ RunControlContext c = ctx.context.getData();
+ return c != null && c.canSuspend();
+ }
}
return false;
}
+ public TCFDSFExecutionDMC getContext(String id) {
+ return cache.get(id);
+ }
+
+ public void getContainerContexts(IContainerDMContext context, final DataRequestMonitor<IExecutionDMContext[]> rm) {
+ getContexts(context, rm, false);
+ }
+
public void getExecutionContexts(IContainerDMContext context, final DataRequestMonitor<IExecutionDMContext[]> rm) {
+ getContexts(context, rm, true);
+ }
+
+ public void getContexts(IContainerDMContext context,
+ final DataRequestMonitor<IExecutionDMContext[]> rm, final boolean has_state) {
+ if (context == null) context = root_dmc;
if (context instanceof ExecutionDMC) {
final ExecutionDMC ctx = (ExecutionDMC)context;
- IDataRequest done = new IDataRequest() {
-
- public void cancel() {
- rm.setCanceled(true);
- rm.done();
- }
-
- @SuppressWarnings("unchecked")
- public void done() {
- if (ctx.error != null) {
- rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- REQUEST_FAILED, "Data error", ctx.error)); //$NON-NLS-1$
+ TCFDataCache<Map<String,ExecutionDMC>> cache = ctx.children;
+ if (!cache.validate()) {
+ cache.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
}
- else {
- rm.setData(ctx.children.values().toArray(new ExecutionDMC[ctx.children.size()]));
+ public void done() {
+ getContexts(ctx, rm, has_state);
}
- rm.done();
+ });
+ return;
+ }
+ if (cache.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", cache.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ if (cache.getData() == null) {
+ rm.setData(new ExecutionDMC[0]);
+ rm.done();
+ return;
+ }
+ final Set<IDataRequest> reqs = new HashSet<IDataRequest>();
+ for (ExecutionDMC e : cache.getData().values()) {
+ if (!e.context.validate()) {
+ IDataRequest req = new IDataRequest() {
+ public void cancel() {
+ if (reqs.remove(this) && reqs.isEmpty()) getContexts(ctx, rm, has_state);
+ }
+ public void done() {
+ if (reqs.remove(this) && reqs.isEmpty()) getContexts(ctx, rm, has_state);
+ }
+ };
+ reqs.add(req);
+ e.context.addWaitingRequest(req);
}
- };
- if (ctx.validateDMC(done)) done.done();
+ // TODO DSF service design does not support lazy retrieval of context state (because isSuspened() is not async)
+ else if (!e.state.validate()) {
+ IDataRequest req = new IDataRequest() {
+ public void cancel() {
+ if (reqs.remove(this) && reqs.isEmpty()) getContexts(ctx, rm, has_state);
+ }
+ public void done() {
+ if (reqs.remove(this) && reqs.isEmpty()) getContexts(ctx, rm, has_state);
+ }
+ };
+ reqs.add(req);
+ e.state.addWaitingRequest(req);
+ }
+ }
+ if (reqs.isEmpty()) {
+ ArrayList<ExecutionDMC> l = new ArrayList<ExecutionDMC>();
+ for (ExecutionDMC e : cache.getData().values()) {
+ assert e.context.isValid();
+ RunControlContext c = e.context.getData();
+ if (c.hasState() == has_state) l.add(e);
+ }
+ rm.setData(l.toArray(new ExecutionDMC[l.size()]));
+ rm.done();
+ }
}
else {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
@@ -680,40 +781,71 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
rm.done();
}
}
+
+ public Collection<TCFDSFExecutionDMC> getCachedContexts() {
+ ArrayList<TCFDSFExecutionDMC> l = new ArrayList<TCFDSFExecutionDMC>();
+ for (ExecutionDMC dmc : cache.values()) l.add(dmc);
+ return l;
+ }
public void step(IDMContext context, StepType stepType, final RequestMonitor rm) {
if (context instanceof ExecutionDMC) {
- final ExecutionDMC x = (ExecutionDMC)context;
- int md = -1;
- switch (stepType) {
- case STEP_OVER:
- md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OVER_LINE;
- break;
- case STEP_INTO:
- md = com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO_LINE;
- break;
- case STEP_RETURN:
- md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OUT;
- break;
- }
- if (md < 0) {
- rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- NOT_SUPPORTED, "Invalid step type", null)); //$NON-NLS-1$
- rm.done();
- }
- else {
- x.ctx.resume(md, 1, new com.windriver.tcf.api.services.IRunControl.DoneCommand() {
- public void doneCommand(IToken token, Exception error) {
- if (error != null) {
- rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ final ExecutionDMC ctx = (ExecutionDMC)context;
+ if (ctx.context.isValid()) {
+ RunControlContext c = ctx.context.getData();
+ if (c != null) {
+ int md = -1;
+ if (c.canResume(com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO_LINE)) {
+ switch (stepType) {
+ case STEP_OVER:
+ md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OVER_LINE;
+ break;
+ case STEP_INTO:
+ md = com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO_LINE;
+ break;
+ case STEP_RETURN:
+ md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OUT;
+ break;
+ }
+ }
+ else {
+ switch (stepType) {
+ case STEP_OVER:
+ md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OVER;
+ break;
+ case STEP_INTO:
+ md = com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO;
+ break;
+ case STEP_RETURN:
+ md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OUT;
+ break;
}
- x.is_stepping--;
+ }
+ if (md < 0) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ NOT_SUPPORTED, "Invalid step type", null)); //$NON-NLS-1$
rm.done();
}
- });
- x.is_stepping++;
+ else {
+ c.resume(md, 1, new com.windriver.tcf.api.services.IRunControl.DoneCommand() {
+ public void doneCommand(IToken token, Exception error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ }
+ ctx.is_stepping--;
+ rm.done();
+ }
+ });
+ ctx.is_stepping++;
+ }
+ return;
+ }
}
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Invalid context", null)); //$NON-NLS-1$
+ rm.done();
}
else {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
@@ -724,37 +856,47 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
public void instructionStep(IDMContext context, StepType stepType, final RequestMonitor rm) {
if (context instanceof ExecutionDMC) {
- final ExecutionDMC x = (ExecutionDMC)context;
- int md = -1;
- switch (stepType) {
- case STEP_OVER:
- md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OVER;
- break;
- case STEP_INTO:
- md = com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO;
- break;
- case STEP_RETURN:
- md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OUT;
- break;
- }
- if (md < 0) {
- rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- NOT_SUPPORTED, "Invalid step type", null)); //$NON-NLS-1$
- rm.done();
- }
- else {
- x.ctx.resume(md, 1, new com.windriver.tcf.api.services.IRunControl.DoneCommand() {
- public void doneCommand(IToken token, Exception error) {
- if (error != null) {
- rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
- }
- x.is_stepping--;
+ final ExecutionDMC ctx = (ExecutionDMC)context;
+ if (ctx.context.isValid()) {
+ RunControlContext c = ctx.context.getData();
+ if (c != null) {
+ int md = -1;
+ switch (stepType) {
+ case STEP_OVER:
+ md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OVER;
+ break;
+ case STEP_INTO:
+ md = com.windriver.tcf.api.services.IRunControl.RM_STEP_INTO;
+ break;
+ case STEP_RETURN:
+ md = com.windriver.tcf.api.services.IRunControl.RM_STEP_OUT;
+ break;
+ }
+ if (md < 0) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ NOT_SUPPORTED, "Invalid step type", null)); //$NON-NLS-1$
rm.done();
}
- });
- x.is_stepping++;
+ else {
+ c.resume(md, 1, new com.windriver.tcf.api.services.IRunControl.DoneCommand() {
+ public void doneCommand(IToken token, Exception error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ }
+ ctx.is_stepping--;
+ rm.done();
+ }
+ });
+ ctx.is_stepping++;
+ }
+ return;
+ }
}
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Invalid context", null)); //$NON-NLS-1$
+ rm.done();
}
else {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
@@ -773,19 +915,29 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
public void resume(IDMContext context, final RequestMonitor rm) {
if (context instanceof ExecutionDMC) {
- final ExecutionDMC x = (ExecutionDMC)context;
- x.ctx.resume(com.windriver.tcf.api.services.IRunControl.RM_RESUME, 1,
- new com.windriver.tcf.api.services.IRunControl.DoneCommand() {
- public void doneCommand(IToken token, Exception error) {
- if (error != null) {
- rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
- }
- x.is_resuming--;
- rm.done();
+ final ExecutionDMC ctx = (ExecutionDMC)context;
+ if (ctx.context.isValid()) {
+ RunControlContext c = ctx.context.getData();
+ if (c != null) {
+ c.resume(com.windriver.tcf.api.services.IRunControl.RM_RESUME, 1,
+ new com.windriver.tcf.api.services.IRunControl.DoneCommand() {
+ public void doneCommand(IToken token, Exception error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ }
+ ctx.is_resuming--;
+ rm.done();
+ }
+ });
+ ctx.is_resuming++;
+ return;
}
- });
- x.is_resuming++;
+ }
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Invalid context", null)); //$NON-NLS-1$
+ rm.done();
}
else {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
@@ -796,16 +948,26 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
public void suspend(IDMContext context, final RequestMonitor rm) {
if (context instanceof ExecutionDMC) {
- final ExecutionDMC x = (ExecutionDMC)context;
- x.ctx.suspend(new com.windriver.tcf.api.services.IRunControl.DoneCommand() {
- public void doneCommand(IToken token, Exception error) {
- if (error != null) {
- rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
- REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
- }
- rm.done();
+ final ExecutionDMC ctx = (ExecutionDMC)context;
+ if (ctx.context.isValid()) {
+ RunControlContext c = ctx.context.getData();
+ if (c != null) {
+ c.suspend(new com.windriver.tcf.api.services.IRunControl.DoneCommand() {
+ public void doneCommand(IToken token, Exception error) {
+ if (rm.isCanceled()) return;
+ if (error != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Command error", error)); //$NON-NLS-1$
+ }
+ rm.done();
+ }
+ });
+ return;
}
- });
+ }
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Invalid context", null)); //$NON-NLS-1$
+ rm.done();
}
else {
rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
@@ -816,14 +978,46 @@ public class TCFDSFRunControl extends AbstractDsfService implements org.eclipse.
public boolean isSuspended(IDMContext context) {
if (context instanceof ExecutionDMC) {
- ExecutionDMC x = (ExecutionDMC)context;
- return x.is_suspended && x.is_resuming == 0 && x.is_stepping == 0;
+ ExecutionDMC ctx = (ExecutionDMC)context;
+ boolean r = false;
+ if (ctx.context.isValid()) {
+ RunControlContext c = ctx.context.getData();
+ if (c != null && c.hasState()) {
+ if (ctx.is_resuming == 0 && ctx.is_stepping == 0 && ctx.state.isValid()) {
+ ExecutionState st = ctx.state.getData();
+ if (st != null) r = st.is_suspended;
+ }
+ }
+ else if (ctx.children.isValid()) {
+ Map<String,ExecutionDMC> m = ctx.children.getData();
+ if (m != null) {
+ for (ExecutionDMC e : m.values()) {
+ if (isSuspended(e)) r = true;
+ }
+ }
+ }
+ }
+ return r;
}
return false;
}
public void getExecutionData(IExecutionDMContext dmc, DataRequestMonitor<IExecutionDMData> rm) {
- // TODO Auto-generated method stub
- assert false;
+ if (dmc instanceof ExecutionDMC) {
+ ExecutionDMC ctx = (ExecutionDMC)dmc;
+ StateChangeReason r = StateChangeReason.UNKNOWN;
+ if (ctx.state.isValid()) {
+ ExecutionState st = ctx.state.getData();
+ if (st != null && st.suspend_reason != null) {
+ r = toStateChangeReason(st.suspend_reason);
+ }
+ }
+ rm.setData(new ExecutionData(r));
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Given context: " + dmc + " is not an execution context.", null)); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ rm.done();
}
}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFStack.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFStack.java
new file mode 100644
index 000000000..85a72f1f7
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFStack.java
@@ -0,0 +1,516 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package com.windriver.tcf.dsf.core.services;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.eclipse.cdt.core.IAddress;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.dd.dsf.concurrent.RequestMonitor;
+import org.eclipse.dd.dsf.datamodel.AbstractDMContext;
+import org.eclipse.dd.dsf.datamodel.IDMContext;
+import org.eclipse.dd.dsf.datamodel.ServiceDMContext;
+import org.eclipse.dd.dsf.debug.service.IRunControl;
+import org.eclipse.dd.dsf.debug.service.IStack;
+import org.eclipse.dd.dsf.debug.service.IRunControl.StateChangeReason;
+import org.eclipse.dd.dsf.service.AbstractDsfService;
+import org.eclipse.dd.dsf.service.DsfServiceEventHandler;
+import org.eclipse.dd.dsf.service.DsfSession;
+import org.osgi.framework.BundleContext;
+
+import com.windriver.tcf.api.protocol.IChannel;
+import com.windriver.tcf.api.protocol.IToken;
+import com.windriver.tcf.api.services.ILineNumbers;
+import com.windriver.tcf.api.services.IStackTrace;
+import com.windriver.tcf.api.services.ILineNumbers.CodeArea;
+import com.windriver.tcf.dsf.core.Activator;
+
+public class TCFDSFStack extends AbstractDsfService implements IStack {
+
+ private static final String TOP_FRAME = "TopFrame:";
+
+ private class TCFFrameDMC extends AbstractDMContext implements IFrameDMContext, Comparable<TCFFrameDMC> {
+
+ final String id;
+ final TCFDSFExecutionDMC exe_dmc;
+ final TCFDataCache<TCFFrameData> frame_data;
+
+ int level;
+ TCFFrameData prev_data;
+
+ public TCFFrameDMC(final TCFDSFExecutionDMC exe_dmc, final String id) {
+ super(TCFDSFStack.this.getSession().getId(), new IDMContext[] { exe_dmc });
+ this.id = id;
+ this.exe_dmc = exe_dmc;
+ frame_data = new TCFDataCache<TCFFrameData>(channel) {
+
+ @Override
+ public boolean startDataRetrieval() {
+ assert command == null;
+ if (id == null || tcf_stk_service == null) {
+ data = null;
+ valid = true;
+ return true;
+ }
+ if (level == 0) {
+ assert id.startsWith(TOP_FRAME);
+ // Top frame is special case: most of its data is stored in CPU registers.
+ // Other frames are stored in memory - in thread stack area.
+ return getTopFrame();
+ }
+ command = tcf_stk_service.getContext(new String[]{ id }, new IStackTrace.DoneGetContext() {
+ public void doneGetContext(IToken token, Exception err, IStackTrace.StackTraceContext[] context) {
+ if (command != token) return;
+ command = null;
+ if (err != null) {
+ error = err;
+ data = null;
+ }
+ else {
+ TCFAddress a = null;
+ Number n = context[0].getReturnAddress();
+ if (n != null) a = new TCFAddress(n);
+ // Optimization: skip source position lookup if same address
+ if (prev_data != null && prev_data.address.equals(a)) {
+ data = prev_data;
+ data.context = context[0];
+ data.level = level;
+ }
+ else {
+ data = new TCFFrameData();
+ data.context = context[0];
+ data.address = a;
+ data.level = level;
+ if (!getSourcePos()) return;
+ }
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+
+ private boolean getTopFrame() {
+ assert level == 0;
+ if (!exe_dmc.validateState()) {
+ exe_dmc.addStateWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ reset();
+ }
+ public void done() {
+ validate();
+ }
+ });
+ return false;
+ }
+ prev_data = data = new TCFFrameData();
+ data.address = exe_dmc.getPC();
+ data.level = level;
+ if (!getSourcePos()) return false;
+ valid = true;
+ return true;
+ }
+
+ private boolean getSourcePos() {
+ if (tcf_lns_service == null) return true;
+ if (data.address == null) return true;
+ BigInteger a1 = data.address.getValue();
+ BigInteger a2 = data.address.add(1).getValue();
+ command = tcf_lns_service.mapToSource(exe_dmc.getTcfContextId(), a1, a2, new ILineNumbers.DoneMapToSource() {
+
+ public void doneMapToSource(IToken token, Exception err, CodeArea[] areas) {
+ if (command != token) return;
+ command = null;
+ if (err != null) {
+ data.src_pos_error = err;
+ }
+ else if (areas != null && areas.length > 0) {
+ for (ILineNumbers.CodeArea area : areas) {
+ if (data.code_area == null || area.start_line < data.code_area.start_line) {
+ data.code_area = area;
+ }
+ }
+ prev_data = data;
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+ };
+ }
+
+ public int getLevel() {
+ return level;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ return super.baseEquals(other) && ((TCFFrameDMC)other).id.equals(id);
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return baseToString() + ".frame[" + id + "]"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ public int compareTo(TCFFrameDMC f) {
+ if (level < f.level) return -1;
+ if (level > f.level) return +1;
+ return 0;
+ }
+ }
+
+ private static class TCFFrameData implements IFrameDMData {
+
+ IStackTrace.StackTraceContext context;
+ IAddress address;
+ int level;
+ String function;
+ Throwable src_pos_error;
+ ILineNumbers.CodeArea code_area;
+
+ public IAddress getAddress() {
+ return address;
+ }
+
+ public String getFunction() {
+ return function;
+ }
+
+ public int getLevel() {
+ return level;
+ }
+
+ public String getFile() {
+ if (code_area == null) return null;
+ return code_area.file;
+ }
+
+ public int getLine() {
+ if (code_area == null) return -1;
+ return code_area.start_line + 1;
+ }
+
+ public int getColumn() {
+ if (code_area == null) return -1;
+ return code_area.start_column + 1;
+ }
+ }
+
+ private class FramesCache extends TCFDataCache<Map<String,TCFFrameDMC>> implements TCFDSFExecutionDMC.DataCache {
+
+ private final TCFDSFExecutionDMC dmc;
+ private final Map<String,TCFFrameDMC> frame_pool;
+
+ FramesCache(IChannel channel, TCFDSFExecutionDMC dmc) {
+ super(channel);
+ this.dmc = dmc;
+ frame_pool = new HashMap<String,TCFFrameDMC>();
+ }
+
+ @Override
+ public boolean startDataRetrieval() {
+ assert command == null;
+ if (tcf_stk_service == null) {
+ data = null;
+ valid = true;
+ return true;
+ }
+ assert !dmc.isDisposed();
+ command = tcf_stk_service.getChildren(dmc.getTcfContextId(), new IStackTrace.DoneGetChildren() {
+ public void doneGetChildren(IToken token, Exception err, String[] contexts) {
+ if (command != token) return;
+ command = null;
+ if (err != null) {
+ data = null;
+ error = err;
+ }
+ else {
+ data = new HashMap<String,TCFFrameDMC>();
+ for (int i = 0; i < contexts.length; i++) {
+ String id = contexts[i];
+ TCFFrameDMC n = frame_pool.get(id);
+ if (n == null) frame_pool.put(id, n = new TCFFrameDMC(dmc, id));
+ n.level = contexts.length - i;
+ data.put(id, n);
+ }
+ String id = TOP_FRAME + dmc.getTcfContextId();
+ TCFFrameDMC n = frame_pool.get(id);
+ if (n == null) frame_pool.put(id, n = new TCFFrameDMC(dmc, id));
+ n.level = 0;
+ data.put(id, n);
+ }
+ valid = true;
+ validate();
+ }
+ });
+ return false;
+ }
+
+ void invalidateFrames() {
+ reset();
+ for (TCFFrameDMC dmc : frame_pool.values()) dmc.frame_data.reset();
+ }
+
+ void dispose() {
+ }
+ }
+
+ private final IChannel channel;
+ private final IStackTrace tcf_stk_service;
+ private final ILineNumbers tcf_lns_service;
+ private IDMContext service_dmc;
+
+ public TCFDSFStack(DsfSession session, IChannel channel, final RequestMonitor monitor) {
+ super(session);
+ this.channel = channel;
+ tcf_stk_service = channel.getRemoteService(IStackTrace.class);
+ tcf_lns_service = channel.getRemoteService(ILineNumbers.class);
+ service_dmc = new ServiceDMContext(this, "#stack_trace");
+ initialize(new RequestMonitor(getExecutor(), monitor) {
+ @Override
+ protected void handleOK() {
+ String[] class_names = {
+ IStack.class.getName(),
+ TCFDSFStack.class.getName()
+ };
+ register(class_names, new Hashtable<String,String>());
+ getSession().addServiceEventListener(TCFDSFStack.this, null);
+ monitor.done();
+ }
+ });
+ }
+
+ @Override
+ public void shutdown(RequestMonitor monitor) {
+ getSession().removeServiceEventListener(this);
+ unregister();
+ super.shutdown(monitor);
+ }
+
+ @Override
+ protected BundleContext getBundleContext() {
+ return Activator.getBundleContext();
+ }
+
+ public IDMContext getServiceContext() {
+ return service_dmc;
+ }
+
+ public void getArguments(IDMContext dmc, DataRequestMonitor<IVariableDMContext[]> rm) {
+ if (dmc instanceof TCFFrameDMC) {
+ // TODO function arguments
+ rm.setData(new IVariableDMContext[0]);
+ rm.done();
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ public void getFrameData(final IFrameDMContext dmc, final DataRequestMonitor<IFrameDMData> rm) {
+ if (dmc instanceof TCFFrameDMC) {
+ final TCFFrameDMC frame_dmc = (TCFFrameDMC)dmc;
+ TCFDataCache<TCFFrameData> cache = frame_dmc.frame_data;
+ if (!cache.validate()) {
+ cache.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ getFrameData(dmc, rm);
+ }
+ });
+ return;
+ }
+ if (cache.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", cache.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ rm.setData(cache.getData());
+ rm.done();
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ public void getFrames(final IDMContext dmc, final DataRequestMonitor<IFrameDMContext[]> rm) {
+ if (tcf_stk_service == null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Stack trace service is not available", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ else if (dmc instanceof TCFDSFExecutionDMC) {
+ TCFDSFExecutionDMC exe = (TCFDSFExecutionDMC)dmc;
+ if (exe.isDisposed()) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ if (exe.stack_frames_cache == null) exe.stack_frames_cache = new FramesCache(channel, exe);
+ FramesCache cache = (FramesCache)exe.stack_frames_cache;
+ if (!cache.validate()) {
+ cache.addWaitingRequest(new IDataRequest() {
+ public void cancel() {
+ rm.setStatus(new Status(IStatus.CANCEL, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Canceled", null)); //$NON-NLS-1$
+ rm.setCanceled(true);
+ rm.done();
+ }
+ public void done() {
+ getFrames(dmc, rm);
+ }
+ });
+ return;
+ }
+ if (cache.getError() != null) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ REQUEST_FAILED, "Data error", cache.getError())); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ Map<String,TCFFrameDMC> c = cache.getData();
+ TCFFrameDMC[] arr = c.values().toArray(new TCFFrameDMC[c.size()]);
+ Arrays.sort(arr);
+ rm.setData(arr);
+ rm.done();
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ public void getLocals(IDMContext dmc, DataRequestMonitor<IVariableDMContext[]> rm) {
+ if (dmc instanceof TCFFrameDMC) {
+ // TODO function local variables
+ rm.setData(new IVariableDMContext[0]);
+ rm.done();
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ public void getStackDepth(DataRequestMonitor<Integer> rm) {
+ // TODO don't know what getStackDepth() is supposed to return
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+
+ public void getStackDepth(int maxDepth, DataRequestMonitor<Integer> rm) {
+ // TODO don't know what getStackDepth() is supposed to return
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+
+ public void getTopFrame(IDMContext dmc, DataRequestMonitor<IFrameDMContext> rm) {
+ if (dmc instanceof TCFDSFExecutionDMC) {
+ TCFDSFExecutionDMC exe = (TCFDSFExecutionDMC)dmc;
+ if (exe.isDisposed()) {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Disposed DMC", null)); //$NON-NLS-1$
+ rm.done();
+ return;
+ }
+ if (exe.stack_frames_cache == null) exe.stack_frames_cache = new FramesCache(channel, exe);
+ FramesCache cache = (FramesCache)exe.stack_frames_cache;
+ String id = TOP_FRAME + exe.getTcfContextId();
+ TCFFrameDMC n = cache.frame_pool.get(id);
+ if (n == null) cache.frame_pool.put(id, n = new TCFFrameDMC(exe, id));
+ n.level = 0;
+ rm.setData(n);
+ rm.done();
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ public void getVariableData(IVariableDMContext variableDmc, DataRequestMonitor<IVariableDMData> rm) {
+ // TODO model data for local variables
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+
+ public boolean isStackAvailable(IDMContext dmc) {
+ return tcf_stk_service != null && dmc instanceof TCFDSFExecutionDMC;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void getModelData(IDMContext dmc, DataRequestMonitor<?> rm) {
+ if (dmc instanceof IFrameDMContext) {
+ getFrameData((IFrameDMContext)dmc, (DataRequestMonitor<IFrameDMData>)rm);
+ }
+ else if (dmc == service_dmc) {
+ ((DataRequestMonitor<TCFDSFStack>)rm).setData(this);
+ rm.done();
+ }
+ else {
+ rm.setStatus(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+ INVALID_HANDLE, "Unknown DMC type", null)); //$NON-NLS-1$
+ rm.done();
+ }
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(IRunControl.IResumedDMEvent e) {
+ if (e.getReason() != StateChangeReason.STEP) {
+ FramesCache cache = (FramesCache)((TCFDSFExecutionDMC)e.getDMContext()).stack_frames_cache;
+ if (cache != null) cache.invalidateFrames();
+ }
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(IRunControl.ISuspendedDMEvent e) {
+ FramesCache cache = (FramesCache)((TCFDSFExecutionDMC)e.getDMContext()).stack_frames_cache;
+ if (cache != null) cache.invalidateFrames();
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(IRunControl.IExitedDMEvent e) {
+ FramesCache cache = (FramesCache)((TCFDSFExecutionDMC)e.getExecutionContext()).stack_frames_cache;
+ if (cache != null) cache.dispose();
+ }
+}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFStepQueueManager.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFStepQueueManager.java
new file mode 100644
index 000000000..360a95ac4
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDSFStepQueueManager.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package com.windriver.tcf.dsf.core.services;
+
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.dd.dsf.concurrent.DsfRunnable;
+import org.eclipse.dd.dsf.concurrent.RequestMonitor;
+import org.eclipse.dd.dsf.datamodel.DMContexts;
+import org.eclipse.dd.dsf.datamodel.IDMContext;
+import org.eclipse.dd.dsf.debug.service.IRunControl;
+import org.eclipse.dd.dsf.debug.service.IStepQueueManager;
+import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext;
+import org.eclipse.dd.dsf.debug.service.IRunControl.IResumedDMEvent;
+import org.eclipse.dd.dsf.debug.service.IRunControl.ISuspendedDMEvent;
+import org.eclipse.dd.dsf.debug.service.IRunControl.StateChangeReason;
+import org.eclipse.dd.dsf.debug.service.IRunControl.StepType;
+import org.eclipse.dd.dsf.service.AbstractDsfService;
+import org.eclipse.dd.dsf.service.DsfServiceEventHandler;
+import org.eclipse.dd.dsf.service.DsfSession;
+import org.osgi.framework.BundleContext;
+
+import com.windriver.tcf.dsf.core.Activator;
+
+public class TCFDSFStepQueueManager extends AbstractDsfService
+implements IStepQueueManager{
+
+ private static class StepRequest {
+ StepType fStepType;
+ boolean fIsInstructionStep;
+ StepRequest(StepType type, boolean instruction) {
+ fStepType = type;
+ fIsInstructionStep = instruction;
+ }
+ }
+
+ private IRunControl fRunControl;
+ private int fQueueDepth = 3;
+ private Map<IExecutionDMContext,List<StepRequest>> fStepQueues = new HashMap<IExecutionDMContext,List<StepRequest>>();
+ private Map<IExecutionDMContext,Boolean> fTimedOutFlags = new HashMap<IExecutionDMContext,Boolean>();
+ private Map<IExecutionDMContext,ScheduledFuture<?>> fTimedOutFutures = new HashMap<IExecutionDMContext,ScheduledFuture<?>>();
+
+ public TCFDSFStepQueueManager(DsfSession session) {
+ super(session);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // IDsfService
+ @Override
+ public void initialize(final RequestMonitor requestMonitor) {
+ super.initialize(
+ new RequestMonitor(getExecutor(), requestMonitor) {
+ @Override
+ protected void handleOK() {
+ doInitialize(requestMonitor);
+ }});
+ }
+
+ private void doInitialize(final RequestMonitor requestMonitor) {
+ fRunControl = getServicesTracker().getService(IRunControl.class);
+
+ getSession().addServiceEventListener(this, null);
+ register(new String[]{IStepQueueManager.class.getName()}, new Hashtable<String,String>());
+ requestMonitor.done();
+ }
+
+ @Override
+ public void shutdown(final RequestMonitor requestMonitor) {
+ unregister();
+ getSession().removeServiceEventListener(this);
+ super.shutdown(requestMonitor);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // AbstractService
+ @Override
+ protected BundleContext getBundleContext() {
+ return Activator.getBundleContext();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // IStepQueueManager
+ public boolean canEnqueueStep(IDMContext ctx) {
+ IExecutionDMContext execCtx = DMContexts.getAncestorOfType(ctx, IExecutionDMContext.class);
+ return execCtx != null &&
+ ( (fRunControl.isSuspended(execCtx) && fRunControl.canStep(execCtx)) ||
+ (fRunControl.isStepping(execCtx) && !isSteppingTimedOut(execCtx)) );
+ }
+
+ // IStepQueueManager
+ public boolean canEnqueueInstructionStep(IDMContext ctx) {
+ IExecutionDMContext execCtx = DMContexts.getAncestorOfType(ctx, IExecutionDMContext.class);
+ return execCtx != null &&
+ ( (fRunControl.isSuspended(execCtx) && fRunControl.canInstructionStep(execCtx)) ||
+ (fRunControl.isStepping(execCtx) && !isSteppingTimedOut(execCtx)) );
+ }
+
+ public int getPendingStepCount(IDMContext execCtx) {
+ List<StepRequest> stepQueue = fStepQueues.get(execCtx);
+ if (stepQueue == null) return 0;
+ return stepQueue.size();
+ }
+
+ public void enqueueStep(IDMContext ctx, StepType stepType) {
+ IExecutionDMContext execCtx = DMContexts.getAncestorOfType(ctx, IExecutionDMContext.class);
+ if (execCtx != null) {
+ if (fRunControl.canStep(execCtx)) {
+ fRunControl.step(execCtx, stepType, new RequestMonitor(getExecutor(), null));
+ } else if (canEnqueueStep(execCtx)) {
+ List<StepRequest> stepQueue = fStepQueues.get(execCtx);
+ if (stepQueue == null) {
+ stepQueue = new LinkedList<StepRequest>();
+ fStepQueues.put(execCtx, stepQueue);
+ }
+ if (stepQueue.size() < fQueueDepth) {
+ stepQueue.add(new StepRequest(stepType, false));
+ }
+ }
+ }
+ }
+
+ public void enqueueInstructionStep(IDMContext ctx, StepType stepType) {
+ IExecutionDMContext execCtx = DMContexts.getAncestorOfType(ctx, IExecutionDMContext.class);
+ if (execCtx != null) {
+ if (fRunControl.canInstructionStep(execCtx)) {
+ fRunControl.instructionStep(execCtx, stepType, new RequestMonitor(getExecutor(), null));
+ }
+ else if (canEnqueueInstructionStep(execCtx)) {
+ List<StepRequest> stepQueue = fStepQueues.get(execCtx);
+ if (stepQueue == null) {
+ stepQueue = new LinkedList<StepRequest>();
+ fStepQueues.put(execCtx, stepQueue);
+ }
+ if (stepQueue.size() < fQueueDepth) {
+ stepQueue.add(new StepRequest(stepType, true));
+ }
+ }
+ }
+ }
+
+ public boolean isSteppingTimedOut(IDMContext context) {
+ IExecutionDMContext execCtx = DMContexts.getAncestorOfType(context, IExecutionDMContext.class);
+ if (execCtx != null) {
+ return fTimedOutFlags.containsKey(execCtx) ? fTimedOutFlags.get(execCtx) : false;
+ }
+ return false;
+ }
+
+
+ public int getStepQueueDepth() { return fQueueDepth; }
+ public void setStepQueueDepth(int depth) { fQueueDepth = depth; }
+
+ ///////////////////////////////////////////////////////////////////////////
+
+ @DsfServiceEventHandler
+ public void eventDispatched(ISuspendedDMEvent e) {
+ // Take care of the stepping time out
+ fTimedOutFlags.remove(e.getDMContext());
+ ScheduledFuture<?> future = fTimedOutFutures.remove(e.getDMContext());
+ if (future != null) future.cancel(false);
+
+ // Check if there's a step pending, if so execute it
+ if (fStepQueues.containsKey(e.getDMContext())) {
+ List<StepRequest> queue = fStepQueues.get(e.getDMContext());
+ StepRequest request = queue.remove(queue.size() - 1);
+ if (queue.isEmpty()) fStepQueues.remove(e.getDMContext());
+ if (request.fIsInstructionStep) {
+ if (fRunControl.canInstructionStep(e.getDMContext())) {
+ fRunControl.instructionStep(
+ e.getDMContext(), request.fStepType, new RequestMonitor(getExecutor(), null));
+ } else {
+ // For whatever reason we can't step anymore, so clear out
+ // the step queue.
+ fStepQueues.remove(e.getDMContext());
+ }
+ } else {
+ if (fRunControl.canStep(e.getDMContext())) {
+ fRunControl.step(e.getDMContext(), request.fStepType,new RequestMonitor(getExecutor(), null));
+ } else {
+ // For whatever reason we can't step anymore, so clear out
+ // the step queue.
+ fStepQueues.remove(e.getDMContext());
+ }
+ }
+ }
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(final IResumedDMEvent e) {
+ if (e.getReason().equals(StateChangeReason.STEP)) {
+ fTimedOutFlags.put(e.getDMContext(), Boolean.FALSE);
+ // We shouldn't have a stepping timeout running unless we get two
+ // stepping events in a row without a suspended, which would be a
+ // protocol error.
+ assert !fTimedOutFutures.containsKey(e.getDMContext());
+ fTimedOutFutures.put(
+ e.getDMContext(),
+ getExecutor().schedule(
+ new DsfRunnable() { public void run() {
+ fTimedOutFutures.remove(e.getDMContext());
+
+ // Issue the stepping time-out event.
+ getSession().dispatchEvent(
+ new ISteppingTimedOutEvent() {
+ public IExecutionDMContext getDMContext() { return e.getDMContext(); }
+ },
+ getProperties());
+ }},
+ STEPPING_TIMEOUT, TimeUnit.MILLISECONDS)
+ );
+
+ }
+ }
+
+ @DsfServiceEventHandler
+ public void eventDispatched(ISteppingTimedOutEvent e) {
+ fTimedOutFlags.put(e.getDMContext(), Boolean.TRUE);
+ }
+}
diff --git a/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDataCache.java b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDataCache.java
new file mode 100644
index 000000000..18c8addd3
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.core/src/com/windriver/tcf/dsf/core/services/TCFDataCache.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Wind River Systems, Inc. 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package com.windriver.tcf.dsf.core.services;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import com.windriver.tcf.api.protocol.IChannel;
+import com.windriver.tcf.api.protocol.IToken;
+import com.windriver.tcf.api.protocol.Protocol;
+
+public abstract class TCFDataCache<V> {
+
+ protected Throwable error;
+ protected IToken command;
+ protected boolean valid;
+ protected V data;
+
+ protected final IChannel channel;
+ protected final Collection<IDataRequest> waiting_list = new ArrayList<IDataRequest>();
+
+ public TCFDataCache(IChannel channel) {
+ assert channel != null;
+ this.channel = channel;
+ }
+
+ public void cancel() {
+ // Cancel current data retrieval command
+ if (command != null) {
+ command.cancel();
+ command = null;
+ }
+ // Cancel waiting data requests
+ if (!waiting_list.isEmpty()) {
+ IDataRequest[] arr = waiting_list.toArray(new IDataRequest[waiting_list.size()]);
+ waiting_list.clear();
+ for (IDataRequest r : arr) r.cancel();
+ }
+ }
+
+ public boolean validate() {
+ assert Protocol.isDispatchThread();
+ if (channel.getState() != IChannel.STATE_OPEN) {
+ error = null;
+ command = null;
+ data = null;
+ valid = true;
+ return true;
+ }
+ if (command != null) {
+ return false;
+ }
+ if (!valid && !startDataRetrieval()) return false;
+ assert command == null;
+ if (!waiting_list.isEmpty()) {
+ IDataRequest[] arr = waiting_list.toArray(new IDataRequest[waiting_list.size()]);
+ waiting_list.clear();
+ for (IDataRequest r : arr) r.done();
+ }
+ return true;
+ }
+
+ public void addWaitingRequest(IDataRequest req) {
+ assert !valid;
+ waiting_list.add(req);
+ }
+
+ public void reset(V data) {
+ cancel();
+ this.data = data;
+ error = null;
+ valid = true;
+ }
+
+ public void reset() {
+ cancel();
+ error = null;
+ data = null;
+ valid = false;
+ }
+
+ public boolean isValid() {
+ return valid;
+ }
+
+ public Throwable getError() {
+ assert valid;
+ return error;
+ }
+
+ public V getData() {
+ assert valid;
+ return data;
+ }
+
+ public abstract boolean startDataRetrieval();
+}
diff --git a/plugins/com.windriver.tcf.dsf.ui/.classpath b/plugins/com.windriver.tcf.dsf.ui/.classpath
index 751c8f2e5..304e86186 100644
--- a/plugins/com.windriver.tcf.dsf.ui/.classpath
+++ b/plugins/com.windriver.tcf.dsf.ui/.classpath
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/plugins/com.windriver.tcf.dsf.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/com.windriver.tcf.dsf.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..0bf81e2f5
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,272 @@
+#Tue Feb 05 15:38:16 CET 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,.svn/
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=8
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/plugins/com.windriver.tcf.dsf.ui/.settings/org.eclipse.jdt.ui.prefs b/plugins/com.windriver.tcf.dsf.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 000000000..55a9abb5d
--- /dev/null
+++ b/plugins/com.windriver.tcf.dsf.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Wed Jan 09 12:21:39 PST 2008
+eclipse.preferences.version=1
+formatter_profile=_Java STD
+formatter_settings_version=11
diff --git a/plugins/com.windriver.tcf.dsf.ui/META-INF/MANIFEST.MF b/plugins/com.windriver.tcf.dsf.ui/META-INF/MANIFEST.MF
index a4b898b02..d76310516 100644
--- a/plugins/com.windriver.tcf.dsf.ui/META-INF/MANIFEST.MF
+++ b/plugins/com.windriver.tcf.dsf.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: com.windriver.tcf.dsf.ui;singleton:=true
-Bundle-Version: 0.1.0
+Bundle-Version: 0.2.0
Bundle-Activator: com.windriver.tcf.dsf.ui.Activator
Bundle-Vendor: %providerName
Require-Bundle: org.eclipse.ui,
@@ -16,5 +16,6 @@ Require-Bundle: org.eclipse.ui,
com.windriver.debug.tcf.core,
com.windriver.debug.tcf.ui,
com.windriver.tcf.dsf.core
+Bundle-ActivationPolicy: lazy
Eclipse-LazyStart: true
Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/com.windriver.tcf.dsf.ui/build.properties b/plugins/com.windriver.tcf.dsf.ui/build.properties
index e9863e281..cd72b059e 100644
--- a/plugins/com.windriver.tcf.dsf.ui/build.properties
+++ b/plugins/com.windriver.tcf.dsf.ui/build.properties
@@ -2,4 +2,8 @@ source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
- plugin.xml
+ plugin.xml,\
+ about.html,\
+ icons/,\
+ plugin.properties
+src.includes = about.html
diff --git a/plugins/com.windriver.tcf.dsf.ui/plugin.xml b/plugins/com.windriver.tcf.dsf.ui/plugin.xml
index 4da1ce1d0..4be8bb538 100644
--- a/plugins/com.windriver.tcf.dsf.ui/plugin.xml
+++ b/plugins/com.windriver.tcf.dsf.ui/plugin.xml
@@ -2,7 +2,7 @@
<?eclipse version="3.2"?>
<plugin>
- <extension point="com.windriver.debug.tcf.core.startup"/>
+ <extension point="com.windriver.tcf.api.startup"/>
<extension point="org.eclipse.debug.ui.launchConfigurationTabGroups">
<launchConfigurationTabGroup
@@ -24,7 +24,6 @@
<factory
class="com.windriver.tcf.dsf.ui.AdapterFactory"
adaptableType="com.windriver.tcf.dsf.core.launch.TCFDSFLaunch">
- <adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider"/>
<adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider"/>
<adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory"/>
<adapter type="org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory"/>
@@ -32,4 +31,15 @@
</factory>
</extension>
+ <extension point="org.eclipse.debug.ui.memoryRenderings">
+ <renderingBindings
+ defaultIds="org.eclipse.debug.ui.rendering.raw_memory"
+ primaryId="org.eclipse.debug.ui.rendering.raw_memory"
+ renderingIds="org.eclipse.debug.ui.rendering.raw_memory,org.eclipse.debug.ui.rendering.ascii,org.eclipse.debug.ui.rendering.signedint,org.eclipse.debug.ui.rendering.unsignedint">
+ <enablement>
+ <instanceof value="org.eclipse.dd.dsf.debug.model.DsfMemoryBlock"/>
+ </enablement>
+ </renderingBindings>
+ </extension>
+
</plugin>
diff --git a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/Activator.java b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/Activator.java
index f37328701..3244699a4 100644
--- a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/Activator.java
+++ b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/Activator.java
@@ -18,43 +18,42 @@ import org.osgi.framework.BundleContext;
*/
public class Activator extends AbstractUIPlugin {
- // The plug-in ID
- public static final String PLUGIN_ID = "com.windriver.tcf.dsf.ui";
-
- // The shared instance
- private static Activator plugin;
-
- /**
- * The constructor
- */
- public Activator() {
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
- */
- public void start(BundleContext context) throws Exception {
- super.start(context);
- plugin = this;
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
- */
- public void stop(BundleContext context) throws Exception {
- plugin = null;
- super.stop(context);
- }
-
- /**
- * Returns the shared instance
- *
- * @return the shared instance
- */
- public static Activator getDefault() {
- return plugin;
- }
-
+ // The plug-in ID
+ public static final String PLUGIN_ID = "com.windriver.tcf.dsf.ui";
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
}
diff --git a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/AdapterFactory.java b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/AdapterFactory.java
index f8d0604f8..44c66914e 100644
--- a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/AdapterFactory.java
+++ b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/AdapterFactory.java
@@ -37,7 +37,6 @@ import org.eclipse.debug.core.model.IDebugModelProvider;
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
import org.eclipse.debug.ui.sourcelookup.ISourceDisplay;
@@ -49,95 +48,95 @@ public class AdapterFactory implements IAdapterFactory, DsfSession.SessionEndedL
@Immutable
private final class SessionAdapterSet {
-
- private final DsfSession fSession;
- final ViewModelAdapter fViewModelAdapter;
- final MISourceDisplayAdapter fSourceDisplayAdapter;
- final DsfStepIntoCommand fStepIntoCommand;
- final DsfStepOverCommand fStepOverCommand;
- final DsfStepReturnCommand fStepReturnCommand;
- final DsfSuspendCommand fSuspendCommand;
- final DsfResumeCommand fResumeCommand;
- final DsfTerminateCommand fTerminateCommand;
- final IDebugModelProvider fDebugModelProvider;
- final TCFDSFLaunch fLaunch;
+
+ private final DsfSession session;
+ final ViewModelAdapter view_model_adapter;
+ final MISourceDisplayAdapter source_display_adapter;
+ final DsfStepIntoCommand step_into_command;
+ final DsfStepOverCommand step_over_command;
+ final DsfStepReturnCommand step_return_command;
+ final DsfSuspendCommand suspend_command;
+ final DsfResumeCommand resume_command;
+ final DsfTerminateCommand terminate_command;
+ final IDebugModelProvider debug_model_provider;
+ final TCFDSFLaunch lunch;
SessionAdapterSet(DsfSession session, TCFDSFLaunch launch) {
- fSession = session;
-
- fViewModelAdapter = new ViewModelAdapter(session, launch);
+ this.session = session;
+
+ view_model_adapter = new ViewModelAdapter(session, launch);
if (launch.getSourceLocator() instanceof ISourceLookupDirector) {
- fSourceDisplayAdapter = new MISourceDisplayAdapter(session, (ISourceLookupDirector)launch.getSourceLocator());
- } else {
- fSourceDisplayAdapter = null;
+ source_display_adapter = new MISourceDisplayAdapter(session, (ISourceLookupDirector)launch.getSourceLocator());
}
- session.registerModelAdapter(ISourceDisplay.class, fSourceDisplayAdapter);
-
- fStepIntoCommand = new DsfStepIntoCommand(session);
- fStepOverCommand = new DsfStepOverCommand(session);
- fStepReturnCommand = new DsfStepReturnCommand(session);
- fSuspendCommand = new DsfSuspendCommand(session);
- fResumeCommand = new DsfResumeCommand(session);
- fTerminateCommand = new DsfTerminateCommand(session);
- session.registerModelAdapter(IStepIntoHandler.class, fStepIntoCommand);
- session.registerModelAdapter(IStepOverHandler.class, fStepOverCommand);
- session.registerModelAdapter(IStepReturnHandler.class, fStepReturnCommand);
- session.registerModelAdapter(ISuspendHandler.class, fSuspendCommand);
- session.registerModelAdapter(IResumeHandler.class, fResumeCommand);
- session.registerModelAdapter(ITerminateHandler.class, fTerminateCommand);
-
- fDebugModelProvider = new IDebugModelProvider() {
+ else {
+ source_display_adapter = null;
+ }
+ session.registerModelAdapter(ISourceDisplay.class, source_display_adapter);
+
+ step_into_command = new DsfStepIntoCommand(session);
+ step_over_command = new DsfStepOverCommand(session);
+ step_return_command = new DsfStepReturnCommand(session);
+ suspend_command = new DsfSuspendCommand(session);
+ resume_command = new DsfResumeCommand(session);
+ terminate_command = new DsfTerminateCommand(session);
+ session.registerModelAdapter(IStepIntoHandler.class, step_into_command);
+ session.registerModelAdapter(IStepOverHandler.class, step_over_command);
+ session.registerModelAdapter(IStepReturnHandler.class, step_return_command);
+ session.registerModelAdapter(ISuspendHandler.class, suspend_command);
+ session.registerModelAdapter(IResumeHandler.class, resume_command);
+ session.registerModelAdapter(ITerminateHandler.class, terminate_command);
+
+ debug_model_provider = new IDebugModelProvider() {
// @see org.eclipse.debug.core.model.IDebugModelProvider#getModelIdentifiers()
public String[] getModelIdentifiers() {
return new String[] { ITCFConstants.ID_TCF_DEBUG_MODEL };
}
};
- session.registerModelAdapter(IDebugModelProvider.class, fDebugModelProvider);
+ session.registerModelAdapter(IDebugModelProvider.class, debug_model_provider);
+
+ lunch = launch;
- fLaunch = launch;
-
/*
* Registering the launch as an adapter, ensures that this launch,
* and debug model ID will be associated with all DMContexts from this
* session.
*/
- session.registerModelAdapter(ILaunch.class, fLaunch);
+ session.registerModelAdapter(ILaunch.class, lunch);
}
-
+
void dispose() {
- fViewModelAdapter.dispose();
-
- fSession.unregisterModelAdapter(ISourceDisplay.class);
- if (fSourceDisplayAdapter != null) fSourceDisplayAdapter.dispose();
-
- fSession.unregisterModelAdapter(IStepIntoHandler.class);
- fSession.unregisterModelAdapter(IStepOverHandler.class);
- fSession.unregisterModelAdapter(IStepReturnHandler.class);
- fSession.unregisterModelAdapter(ISuspendHandler.class);
- fSession.unregisterModelAdapter(IResumeHandler.class);
- fSession.unregisterModelAdapter(ITerminateHandler.class);
- fStepIntoCommand.dispose();
- fStepOverCommand.dispose();
- fStepReturnCommand.dispose();
- fSuspendCommand.dispose();
- fResumeCommand.dispose();
- fTerminateCommand.dispose();
+ view_model_adapter.dispose();
+
+ session.unregisterModelAdapter(ISourceDisplay.class);
+ if (source_display_adapter != null) source_display_adapter.dispose();
+
+ session.unregisterModelAdapter(IStepIntoHandler.class);
+ session.unregisterModelAdapter(IStepOverHandler.class);
+ session.unregisterModelAdapter(IStepReturnHandler.class);
+ session.unregisterModelAdapter(ISuspendHandler.class);
+ session.unregisterModelAdapter(IResumeHandler.class);
+ session.unregisterModelAdapter(ITerminateHandler.class);
+ step_into_command.dispose();
+ step_over_command.dispose();
+ step_return_command.dispose();
+ suspend_command.dispose();
+ resume_command.dispose();
+ terminate_command.dispose();
}
}
-
+
@SuppressWarnings({ "unchecked", "restriction" })
private final Class[] adapter_list = {
- IElementLabelProvider.class,
IElementContentProvider.class,
IColumnPresentationFactory.class,
IModelProxyFactory.class,
ITerminateHandler.class
};
- private Map<String,SessionAdapterSet> fSessionAdapterSetMap =
+ private Map<String,SessionAdapterSet> session_adapter_set_map =
Collections.synchronizedMap(new HashMap<String,SessionAdapterSet>());
-
+
public AdapterFactory() {
DsfSession.addSessionEndedListener(this);
DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
@@ -156,20 +155,19 @@ public class AdapterFactory implements IAdapterFactory, DsfSession.SessionEndedL
if (session == null) return null;
SessionAdapterSet adapter_set;
- synchronized(fSessionAdapterSetMap) {
- adapter_set = fSessionAdapterSetMap.get(session.getId());
+ synchronized(session_adapter_set_map) {
+ adapter_set = session_adapter_set_map.get(session.getId());
if (adapter_set == null) {
adapter_set = new SessionAdapterSet(session, launch);
- fSessionAdapterSetMap.put(session.getId(), adapter_set);
+ session_adapter_set_map.put(session.getId(), adapter_set);
}
}
-
+
// Returns the adapter type for the launch object.
- if (adapterType.equals(IElementLabelProvider.class)) return adapter_set.fViewModelAdapter;
- if (adapterType.equals(IElementContentProvider.class)) return adapter_set.fViewModelAdapter;
- if (adapterType.equals(IModelProxyFactory.class)) return adapter_set.fViewModelAdapter;
- if (adapterType.equals(IColumnPresentationFactory.class)) return adapter_set.fViewModelAdapter;
- if (adapterType.equals(ITerminateHandler.class)) return adapter_set.fTerminateCommand;
+ if (adapterType.equals(IElementContentProvider.class)) return adapter_set.view_model_adapter;
+ if (adapterType.equals(IModelProxyFactory.class)) return adapter_set.view_model_adapter;
+ if (adapterType.equals(IColumnPresentationFactory.class)) return adapter_set.view_model_adapter;
+ if (adapterType.equals(ITerminateHandler.class)) return adapter_set.terminate_command;
return null;
}
@@ -195,10 +193,10 @@ public class AdapterFactory implements IAdapterFactory, DsfSession.SessionEndedL
for (ILaunch launch : launches) {
if (launch instanceof TCFDSFLaunch) {
DsfSession session = ((TCFDSFLaunch)launch).getSession();
- synchronized (fSessionAdapterSetMap) {
- if (fSessionAdapterSetMap.containsKey(session.getId())) {
- fSessionAdapterSetMap.get(session.getId()).dispose();
- fSessionAdapterSetMap.remove(session);
+ synchronized (session_adapter_set_map) {
+ if (session_adapter_set_map.containsKey(session.getId())) {
+ session_adapter_set_map.get(session.getId()).dispose();
+ session_adapter_set_map.remove(session);
}
}
}
diff --git a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ContainerLayoutNode.java b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ContainerLayoutNode.java
index 31d80eba3..89fce7be8 100644
--- a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ContainerLayoutNode.java
+++ b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ContainerLayoutNode.java
@@ -13,15 +13,22 @@
package com.windriver.tcf.dsf.ui;
import org.eclipse.dd.dsf.concurrent.DataRequestMonitor;
+import org.eclipse.dd.dsf.concurrent.RequestMonitor;
+import org.eclipse.dd.dsf.datamodel.IDMEvent;
import org.eclipse.dd.dsf.debug.service.INativeProcesses;
import org.eclipse.dd.dsf.debug.service.IRunControl;
import org.eclipse.dd.dsf.debug.service.INativeProcesses.IProcessDMData;
import org.eclipse.dd.dsf.debug.service.IRunControl.IContainerDMContext;
+import org.eclipse.dd.dsf.debug.service.IRunControl.IExecutionDMContext;
+import org.eclipse.dd.dsf.debug.service.IRunControl.IExitedDMEvent;
+import org.eclipse.dd.dsf.debug.service.IRunControl.IStartedDMEvent;
import org.eclipse.dd.dsf.service.DsfSession;
import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMProvider;
+import org.eclipse.dd.dsf.ui.viewmodel.VMDelta;
import org.eclipse.dd.dsf.ui.viewmodel.dm.AbstractDMVMLayoutNode;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
@@ -35,12 +42,23 @@ public class ContainerLayoutNode extends AbstractDMVMLayoutNode{
}
@Override
- protected void updateElementsInSessionThread(IChildrenUpdate update) {
+ protected void updateElementsInSessionThread(final IChildrenUpdate update) {
if (!checkService(IRunControl.class, null, update)) return;
+ final IContainerDMContext contDmc = findDmcInPath(
+ update.getElementPath().getParentPath(), IContainerDMContext.class);
- IContainerDMContext containerCtx = getServicesTracker().getService(TCFDSFRunControl.class).getContainerDMC();
- update.setChild(new DMVMContext(containerCtx), 0);
- update.done();
+ getServicesTracker().getService(TCFDSFRunControl.class).getContainerContexts(contDmc,
+ new DataRequestMonitor<IExecutionDMContext[]>(getSession().getExecutor(), null){
+ @Override
+ public void handleCompleted() {
+ if (!getStatus().isOK()) {
+ handleFailedUpdate(update);
+ return;
+ }
+ fillUpdateWithVMCs(update, getData());
+ update.done();
+ }
+ });
}
@Override
@@ -58,7 +76,8 @@ public class ContainerLayoutNode extends AbstractDMVMLayoutNode{
if (getServicesTracker().getService(IRunControl.class).isSuspended(dmc)) {
imageKey = IDebugUIConstants.IMG_OBJS_THREAD_SUSPENDED;
- } else {
+ }
+ else {
imageKey = IDebugUIConstants.IMG_OBJS_THREAD_RUNNING;
}
update.setImageDescriptor(DebugUITools.getImageDescriptor(imageKey), 0);
@@ -79,4 +98,27 @@ public class ContainerLayoutNode extends AbstractDMVMLayoutNode{
});
}
}
+
+ @Override
+ protected int getNodeDeltaFlagsForDMEvent(IDMEvent<?> e) {
+ if (e instanceof IStartedDMEvent || e instanceof IExitedDMEvent) {
+ return IModelDelta.CONTENT;
+ }
+ if (e instanceof IRunControl.IContainerResumedDMEvent || e instanceof IRunControl.IContainerSuspendedDMEvent) {
+ return IModelDelta.STATE;
+ }
+ return IModelDelta.NO_CHANGE;
+ }
+
+ @Override
+ protected void buildDeltaForDMEvent(final IDMEvent<?> e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) {
+
+ if (e instanceof IRunControl.IContainerResumedDMEvent || e instanceof IRunControl.IContainerSuspendedDMEvent) {
+ parentDelta.addNode(new DMVMContext(e.getDMContext()), IModelDelta.STATE);
+ }
+ if (e instanceof IStartedDMEvent || e instanceof IExitedDMEvent) {
+ parentDelta.addNode(new DMVMContext(e.getDMContext()), IModelDelta.CONTENT);
+ }
+ super.buildDeltaForDMEvent(e, parentDelta, nodeOffset, requestMonitor);
+ }
}
diff --git a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchDialogTabGroup.java b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchDialogTabGroup.java
index 9a7d62dcc..2b17b6aa0 100644
--- a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchDialogTabGroup.java
+++ b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchDialogTabGroup.java
@@ -27,11 +27,11 @@ public class LaunchDialogTabGroup extends AbstractLaunchConfigurationTabGroup {
public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
setTabs(new ILaunchConfigurationTab[] {
- new TCFMainTab(),
- new TCFArgumentsTab(),
- new EnvironmentTab(),
- new SourceLookupTab(),
- new CommonTab()
+ new TCFMainTab(),
+ new TCFArgumentsTab(),
+ new EnvironmentTab(),
+ new SourceLookupTab(),
+ new CommonTab()
});
}
}
diff --git a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchVMProvider.java b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchVMProvider.java
index caf259806..aad7ddf28 100644
--- a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchVMProvider.java
+++ b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/LaunchVMProvider.java
@@ -34,62 +34,62 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationCont
@SuppressWarnings("restriction")
public class LaunchVMProvider extends AbstractDMVMProvider
- implements IDebugEventSetListener, ILaunchesListener2 {
+implements IDebugEventSetListener, ILaunchesListener2 {
@ThreadSafe
public LaunchVMProvider(AbstractVMAdapter adapter, IPresentationContext presentationContext,
- DsfSession session, ILaunch launch)
+ DsfSession session, ILaunch launch)
{
super(adapter, presentationContext, session);
-
+
IVMRootLayoutNode launchNode = new StandardLaunchRootLayoutNode(this, launch);
// Container node to contain all processes and threads
IVMLayoutNode containerNode = new ContainerLayoutNode(this, getSession());
IVMLayoutNode processesNode = new StandardProcessLayoutNode(this);
launchNode.setChildNodes(new IVMLayoutNode[] { containerNode, processesNode});
-
+
IVMLayoutNode threadsNode = new ThreadLayoutNode(this, getSession());
containerNode.setChildNodes(new IVMLayoutNode[] { threadsNode });
-
+
IVMLayoutNode stackFramesNode = new StackFramesLayoutNode(this, getSession());
threadsNode.setChildNodes(new IVMLayoutNode[] { stackFramesNode });
setRootLayoutNode(launchNode);
-
+
DebugPlugin.getDefault().addDebugEventListener(this);
DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
}
-
-
+
+
public void handleDebugEvents(final DebugEvent[] events) {
if (isDisposed()) return;
-
+
// We're in session's executor thread. Re-dispach to VM Adapter
// executor thread and then call root layout node.
try {
getExecutor().execute(new Runnable() {
public void run() {
if (isDisposed()) return;
-
+
for (final DebugEvent event : events) {
IVMRootLayoutNode rootLayoutNode = getRootLayoutNode();
if (rootLayoutNode != null && rootLayoutNode.getDeltaFlags(event) != 0) {
rootLayoutNode.createDelta(
- event,
- new DataRequestMonitor<IModelDelta>(getExecutor(), null) {
- @Override
- public void handleCompleted() {
- if (getStatus().isOK()) {
- getModelProxy().fireModelChangedNonDispatch(getData());
+ event,
+ new DataRequestMonitor<IModelDelta>(getExecutor(), null) {
+ @Override
+ public void handleCompleted() {
+ if (getStatus().isOK()) {
+ getModelProxy().fireModelChangedNonDispatch(getData());
+ }
}
- }
- @Override
- public String toString() {
- return "Result of a delta for debug event: '" + event.toString() +
+ @Override
+ public String toString() {
+ return "Result of a delta for debug event: '" + event.toString() +
"' in VMP: '" + LaunchVMProvider.this + "'" +
"\n" + getData();
- }
- });
+ }
+ });
}
}
}});
@@ -106,50 +106,51 @@ public class LaunchVMProvider extends AbstractDMVMProvider
DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
super.dispose();
}
-
+
public void launchesAdded(ILaunch[] launches) {
handleLaunchesEvent(new LaunchesEvent(launches, LaunchesEvent.Type.ADDED));
}
-
+
public void launchesRemoved(ILaunch[] launches) {
handleLaunchesEvent(new LaunchesEvent(launches, LaunchesEvent.Type.REMOVED));
}
-
+
public void launchesChanged(ILaunch[] launches) {
handleLaunchesEvent(new LaunchesEvent(launches, LaunchesEvent.Type.CHANGED));
}
-
+
public void launchesTerminated(ILaunch[] launches) {
handleLaunchesEvent(new LaunchesEvent(launches, LaunchesEvent.Type.TERMINATED));
}
-
+
private void handleLaunchesEvent(final LaunchesEvent event) {
if (isDisposed()) return;
-
+
// We're in session's executor thread. Re-dispach to VM Adapter
// executor thread and then call root layout node.
try {
getExecutor().execute(new Runnable() {
public void run() {
if (isDisposed()) return;
-
+
IVMRootLayoutNode rootLayoutNode = getRootLayoutNode();
if (rootLayoutNode != null && rootLayoutNode.getDeltaFlags(event) != 0) {
rootLayoutNode.createDelta(
- event,
- new DataRequestMonitor<IModelDelta>(getExecutor(), null) {
- @Override
- public void handleCompleted() {
- if (getStatus().isOK()) {
- getModelProxy().fireModelChangedNonDispatch(getData());
+ event,
+ new DataRequestMonitor<IModelDelta>(getExecutor(), null) {
+ @Override
+ public void handleCompleted() {
+ if (getStatus().isOK()) {
+ getModelProxy().fireModelChangedNonDispatch(getData());
+ }
}
- }
- @Override public String toString() {
- return "Result of a delta for launch event: '" + event.toString() +
+ @Override
+ public String toString() {
+ return "Result of a delta for launch event: '" + event.toString() +
"' in VMP: '" + LaunchVMProvider.this + "'" +
"\n" + getData();
- }
- });
+ }
+ });
}
}});
}
diff --git a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ThreadLayoutNode.java b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ThreadLayoutNode.java
index 54ef832fc..496d83e64 100644
--- a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ThreadLayoutNode.java
+++ b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ThreadLayoutNode.java
@@ -7,7 +7,7 @@
*
* Contributors:
* Wind River Systems - initial API and implementation
- * Ericsson - Modified for multi threaded functionality
+ * Ericsson - Modified for multi threaded functionality
*******************************************************************************/
package com.windriver.tcf.dsf.ui;
@@ -136,10 +136,14 @@ public class ThreadLayoutNode extends AbstractDMVMLayoutNode {
@Override
protected int getNodeDeltaFlagsForDMEvent(IDMEvent<?> e) {
- if(e instanceof IRunControl.IContainerResumedDMEvent || e instanceof IRunControl.IContainerSuspendedDMEvent || e instanceof IStartedDMEvent || e instanceof IExitedDMEvent) {
+ if (e instanceof IRunControl.IContainerResumedDMEvent ||
+ e instanceof IRunControl.IContainerSuspendedDMEvent ||
+ e instanceof IStartedDMEvent ||
+ e instanceof IExitedDMEvent) {
return IModelDelta.CONTENT;
}
- if(e instanceof IRunControl.IResumedDMEvent || e instanceof IRunControl.ISuspendedDMEvent) {
+ if (e instanceof IRunControl.IResumedDMEvent ||
+ e instanceof IRunControl.ISuspendedDMEvent) {
return IModelDelta.STATE;
}
return IModelDelta.NO_CHANGE;
@@ -147,7 +151,7 @@ public class ThreadLayoutNode extends AbstractDMVMLayoutNode {
@Override
protected void buildDeltaForDMEvent(final IDMEvent<?> e, final VMDelta parentDelta, final int nodeOffset, final RequestMonitor requestMonitor) {
- if(e instanceof IRunControl.IContainerResumedDMEvent || e instanceof IRunControl.IContainerSuspendedDMEvent) {
+ if (e instanceof IRunControl.IContainerResumedDMEvent || e instanceof IRunControl.IContainerSuspendedDMEvent) {
// Since IContainerDMContext sub-classes IExecutionDMContext, container
// events require special processing:
// Retrieve all the thread elements and mark their state as changed.
diff --git a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ViewModelAdapter.java b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ViewModelAdapter.java
index e70d2704c..f52e221db 100644
--- a/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ViewModelAdapter.java
+++ b/plugins/com.windriver.tcf.dsf.ui/src/com/windriver/tcf/dsf/ui/ViewModelAdapter.java
@@ -10,13 +10,6 @@
*******************************************************************************/
package com.windriver.tcf.dsf.ui;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
import org.eclipse.dd.dsf.concurrent.ThreadSafe;
import org.eclipse.dd.dsf.debug.ui.viewmodel.expression.ExpressionVMProvider;
import org.eclipse.dd.dsf.debug.ui.viewmodel.register.RegisterVMProvider;
@@ -25,30 +18,23 @@ import org.eclipse.dd.dsf.service.DsfSession;
import org.eclipse.dd.dsf.ui.viewmodel.dm.AbstractDMVMAdapter;
import org.eclipse.dd.dsf.ui.viewmodel.dm.AbstractDMVMProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-import org.osgi.framework.Bundle;
-import com.windriver.tcf.api.protocol.Protocol;
import com.windriver.tcf.dsf.core.launch.TCFDSFLaunch;
@ThreadSafe
@SuppressWarnings("restriction")
-public class ViewModelAdapter extends AbstractDMVMAdapter implements IElementLabelProvider {
-
+public class ViewModelAdapter extends AbstractDMVMAdapter {
+
private final TCFDSFLaunch launch;
-
+
public ViewModelAdapter(DsfSession session, TCFDSFLaunch launch) {
super(session);
this.launch = launch;
getSession().registerModelAdapter(IColumnPresentationFactory.class, this);
}
-
+
@Override
public void dispose() {
getSession().unregisterModelAdapter(IColumnPresentationFactory.class);
@@ -71,56 +57,4 @@ public class ViewModelAdapter extends AbstractDMVMAdapter implements IElementLab
}
return null;
}
-
- private static final Map<String,ImageDescriptor> image_cache =
- new HashMap<String,ImageDescriptor>();
-
- private static ImageDescriptor getImageDescriptor(String name) {
- if (name == null) return null;
- ImageDescriptor descriptor = image_cache.get(name);
- if (descriptor == null) {
- descriptor = ImageDescriptor.getMissingImageDescriptor();
- Bundle bundle = Platform.getBundle("org.eclipse.debug.ui");
- if (bundle != null){
- URL url = FileLocator.find(bundle, new Path(name), null);
- descriptor = ImageDescriptor.createFromURL(url);
- }
- image_cache.put(name, descriptor);
- }
- return descriptor;
- }
-
- public void update(final ILabelUpdate[] updates) {
- Protocol.invokeLater(new Runnable() {
- public void run() {
- for (ILabelUpdate u : updates) {
- Object o = u.getElement();
- if (o instanceof TCFDSFLaunch) {
- u.setImageDescriptor(getImageDescriptor("icons/full/obj16/ldebug_obj.gif"), 0);
- TCFDSFLaunch launch = (TCFDSFLaunch)o;
- String status = "";
- if (launch.isConnecting()) status = "Connecting";
- else if (launch.isDisconnected()) status = "Disconnected";
- else if (launch.isTerminated()) status = "Terminated";
- Throwable error = launch.getError();
- if (error != null) {
- status += " - " + error;
- u.setForeground(new RGB(255, 0, 0), 0);
- }
- if (status.length() > 0) status = " (" + status + ")";
- u.setLabel(launch.getLaunchConfiguration().getName() + status, 0);
- }
- else {
- u.setForeground(new RGB(255, 0, 0), 0);
- u.setLabel("Invalid object: " + o.getClass(), 0);
- }
- }
- Display.getDefault().asyncExec(new Runnable() {
- public void run() {
- for (ILabelUpdate u : updates) u.done();
- }
- });
- }
- });
- }
}
diff --git a/plugins/com.windriver.tcf.rse.ui/.classpath b/plugins/com.windriver.tcf.rse.ui/.classpath
index 751c8f2e5..304e86186 100644
--- a/plugins/com.windriver.tcf.rse.ui/.classpath
+++ b/plugins/com.windriver.tcf.rse.ui/.classpath
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/plugins/com.windriver.tcf.rse.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/com.windriver.tcf.rse.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..0bf81e2f5
--- /dev/null
+++ b/plugins/com.windriver.tcf.rse.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,272 @@
+#Tue Feb 05 15:38:16 CET 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch,.svn/
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=8
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/plugins/com.windriver.tcf.rse.ui/.settings/org.eclipse.jdt.ui.prefs b/plugins/com.windriver.tcf.rse.ui/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 000000000..24dc6baab
--- /dev/null
+++ b/plugins/com.windriver.tcf.rse.ui/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Mon Jan 07 15:38:45 PST 2008
+eclipse.preferences.version=1
+formatter_profile=_Java STD
+formatter_settings_version=11
diff --git a/plugins/com.windriver.tcf.rse.ui/META-INF/MANIFEST.MF b/plugins/com.windriver.tcf.rse.ui/META-INF/MANIFEST.MF
index b45ab5134..1b7030f6c 100644
--- a/plugins/com.windriver.tcf.rse.ui/META-INF/MANIFEST.MF
+++ b/plugins/com.windriver.tcf.rse.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: com.windriver.tcf.rse.ui;singleton:=true
-Bundle-Version: 0.1.0
+Bundle-Version: 0.2.0
Bundle-Activator: com.windriver.tcf.rse.ui.Activator
Bundle-Vendor: %providerName
Require-Bundle: org.eclipse.ui,
@@ -14,5 +14,6 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.ui.views,
org.eclipse.rse.subsystems.files.core,
org.eclipse.rse.subsystems.processes.core
+Bundle-ActivationPolicy: lazy
Eclipse-LazyStart: true
Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/com.windriver.tcf.rse.ui/build.properties b/plugins/com.windriver.tcf.rse.ui/build.properties
index e9863e281..cd72b059e 100644
--- a/plugins/com.windriver.tcf.rse.ui/build.properties
+++ b/plugins/com.windriver.tcf.rse.ui/build.properties
@@ -2,4 +2,8 @@ source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
- plugin.xml
+ plugin.xml,\
+ about.html,\
+ icons/,\
+ plugin.properties
+src.includes = about.html
diff --git a/plugins/com.windriver.tcf.rse.ui/plugin.xml b/plugins/com.windriver.tcf.rse.ui/plugin.xml
index def23b5df..93325e7fe 100644
--- a/plugins/com.windriver.tcf.rse.ui/plugin.xml
+++ b/plugins/com.windriver.tcf.rse.ui/plugin.xml
@@ -47,7 +47,7 @@
class="com.windriver.tcf.rse.ui.TCFSystemViewProcessAdapterFactory"
adaptableType="com.windriver.tcf.rse.ui.TCFRemoteProcess">
<adapter type="org.eclipse.rse.ui.view.ISystemViewElementAdapter"/>
- <adapter type="org.eclipse.rse.ui.view.ISystemDragDropAdapter"/>
+ <adapter type="org.eclipse.rse.core.subsystems.ISystemDragDropAdapter"/>
<adapter type="org.eclipse.rse.ui.view.ISystemRemoteElementAdapter"/>
<adapter type="org.eclipse.ui.views.properties.IPropertySource"/>
<adapter type="org.eclipse.ui.model.IWorkbenchAdapter"/>
diff --git a/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileResource.java b/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileResource.java
index 39cfa52e6..cb8ff4052 100644
--- a/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileResource.java
+++ b/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileResource.java
@@ -31,6 +31,14 @@ public class TCFFileResource extends AbstractResource implements IHostFile {
name = parent.substring(i + 1);
parent = parent.substring(0, i);
}
+ else if (i == 0) {
+ name = parent.substring(i + 1);
+ parent = "/";
+ }
+ else {
+ name = parent;
+ parent = null;
+ }
}
this.service = service;
this.parent = parent;
diff --git a/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileService.java b/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileService.java
index 6eb030f61..51f5b24ec 100644
--- a/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileService.java
+++ b/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFFileService.java
@@ -294,9 +294,9 @@ public class TCFFileService extends AbstractFileService implements ITCFFileServi
protected IHostFile[] internalFetch(final String parent, final String filter, final int fileType, final IProgressMonitor monitor)
throws SystemMessageException {
- final String path = toRemotePath(parent, null);
- final boolean wantFiles = (fileType==FILE_TYPE_FILES_AND_FOLDERS || (fileType&FILE_TYPE_FILES)!=0);
- final boolean wantFolders = (fileType==FILE_TYPE_FILES_AND_FOLDERS || (fileType%FILE_TYPE_FOLDERS)!=0);
+ final String path = toRemotePath(parent, null);
+ final boolean wantFiles = (fileType==FILE_TYPE_FILES_AND_FOLDERS || (fileType&FILE_TYPE_FILES)!=0);
+ final boolean wantFolders = (fileType==FILE_TYPE_FILES_AND_FOLDERS || (fileType%FILE_TYPE_FOLDERS)!=0);
return new TCFRSETask<IHostFile[]>() {
private IMatcher matcher = null;
public void run() {
@@ -331,11 +331,11 @@ public class TCFFileService extends AbstractFileService implements ITCFFileServi
// the entry is a broken symbolic link
}
else if (e.attrs.isDirectory()) {
- //dont filter folder names if getting both folders and files
- if (wantFolders && (matcher==null || fileType==FILE_TYPE_FILES_AND_FOLDERS || matcher.matches(e.filename))) {
+ //dont filter folder names if getting both folders and files
+ if (wantFolders && (matcher==null || fileType==FILE_TYPE_FILES_AND_FOLDERS || matcher.matches(e.filename))) {
results.add(new TCFFileResource(TCFFileService.this,
path, e.filename, e.attrs, false));
- }
+ }
}
else if (e.attrs.isFile()) {
if (wantFiles && (matcher == null || matcher.matches(e.filename))) {
@@ -414,7 +414,7 @@ public class TCFFileService extends AbstractFileService implements ITCFFileServi
List<TCFFileResource> l = new ArrayList<TCFFileResource>();
for (DirEntry e : entries) {
if (e.attrs == null) continue;
- l.add(new TCFFileResource(TCFFileService.this, "", e.filename, e.attrs, true));
+ l.add(new TCFFileResource(TCFFileService.this, null, e.filename, e.attrs, true));
}
done(l.toArray(new IHostFile[l.size()]));
}
diff --git a/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFRemoteFile.java b/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFRemoteFile.java
index 6b396d610..9f4087af6 100644
--- a/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFRemoteFile.java
+++ b/plugins/com.windriver.tcf.rse.ui/src/com/windriver/tcf/rse/ui/TCFRemoteFile.java
@@ -10,11 +10,16 @@
*******************************************************************************/
package com.windriver.tcf.rse.ui;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
import org.eclipse.rse.services.files.IHostFile;
import org.eclipse.rse.subsystems.files.core.servicesubsystem.AbstractRemoteFile;
import org.eclipse.rse.subsystems.files.core.servicesubsystem.FileServiceSubSystem;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileContext;
+import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
+import org.eclipse.rse.ui.SystemBasePlugin;
public class TCFRemoteFile extends AbstractRemoteFile {
@@ -22,6 +27,25 @@ public class TCFRemoteFile extends AbstractRemoteFile {
super(ss, ctx, parent, file);
}
+ public IRemoteFile getParentRemoteFile() {
+ if (this._parentFile == null) {
+ if (isRoot()) return null;
+ IRemoteFile parentFile = null;
+ IRemoteFileSubSystem ss = _context.getParentRemoteFileSubSystem();
+ if (ss != null) {
+ IProgressMonitor monitor = new NullProgressMonitor();
+ try {
+ parentFile = ss.getRemoteFileObject(getParentPath(), monitor);
+ }
+ catch (SystemMessageException e) {
+ SystemBasePlugin.logError("TCFRemoteFile.getParentRemoteFile()", e); //$NON-NLS-1$
+ }
+ }
+ this._parentFile = parentFile;
+ }
+ return this._parentFile;
+ }
+
public String getCanonicalPath() {
// TODO Auto-generated method stub
return null;
@@ -29,6 +53,6 @@ public class TCFRemoteFile extends AbstractRemoteFile {
public String getClassification() {
// TODO Auto-generated method stub
- return null;
+ return "";
}
}

Back to the top