diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/framework/SyncUtil.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/framework/SyncUtil.java index 6257566a45b..53d26830a00 100644 --- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/framework/SyncUtil.java +++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/framework/SyncUtil.java @@ -20,6 +20,8 @@ import junit.framework.Assert; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.Query; +import org.eclipse.cdt.dsf.concurrent.ThreadSafeAndProhibitedFromDsfExecutor; +import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IExpressions; import org.eclipse.cdt.dsf.debug.service.IFormattedValues; @@ -27,12 +29,14 @@ import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContex import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.FormattedValueDMContext; import org.eclipse.cdt.dsf.debug.service.IFormattedValues.IFormattedDataDMContext; +import org.eclipse.cdt.dsf.debug.service.IProcesses; import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.StepType; import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService; +import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl; import org.eclipse.cdt.dsf.mi.service.IMICommandControl; import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext; import org.eclipse.cdt.dsf.mi.service.IMIProcesses; @@ -68,6 +72,8 @@ public class SyncUtil { private static IContainerDMContext fGdbContainerDmc; private static IBreakpointsTargetDMContext fBreakpointsDmc; + private static IProcesses fProcessesService; + private static IGDBControl fGDBCtrl; public static final int WAIT_FOREVER = ServiceEventWaitor.WAIT_FOREVER; @@ -89,6 +95,8 @@ public class SyncUtil { fRunControl = tracker.getService(MIRunControl.class); fStack = tracker.getService(MIStack.class); fExpressions = tracker.getService(IExpressions.class); + fProcessesService = tracker.getService(IProcesses.class); + fGDBCtrl = tracker.getService(IGDBControl.class); fCommandFactory = tracker.getService(IMICommandControl.class).getCommandFactory(); @@ -519,4 +527,49 @@ public class SyncUtil { return TestsPlugin.massageTimeout(value); } } + + /** + * Utility method to return the process DM context. This can be used only by + * tests that deal with a single heavyweight process. If more than one + * process is available, this method will fail. + * + *

+ * This must NOT be called from the DSF executor. + * + * @return the process context + * @throws InterruptedException + */ + @ThreadSafeAndProhibitedFromDsfExecutor("fSession.getExecutor()") + public static IProcessDMContext getProcessContext() throws InterruptedException { + assert !fProcessesService.getExecutor().isInExecutorThread(); + + final AsyncCompletionWaitor waitor = new AsyncCompletionWaitor(); + + fProcessesService.getExecutor().submit(new Runnable() { + public void run() { + fProcessesService.getProcessesBeingDebugged(fGDBCtrl.getContext(), new DataRequestMonitor(fProcessesService.getExecutor(), null) { + @Override + protected void handleCompleted() { + if (isSuccess()) { + IDMContext[] contexts = getData(); + Assert.assertNotNull("invalid return value from service", contexts); + Assert.assertEquals("unexpected number of processes", contexts.length, 1); + IDMContext context = contexts[0]; + IProcessDMContext processContext = DMContexts.getAncestorOfType(context, IProcessDMContext.class); + Assert.assertNotNull("unexpected process context type ", processContext); + waitor.setReturnInfo(processContext); + } + } + + }); + } + }); + + + + waitor.waitUntilDone(TestsPlugin.massageTimeout(2000)); + Assert.assertTrue(waitor.getMessage(), waitor.isOK()); + return (IProcessDMContext) waitor.getReturnInfo(); + } + } diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/GDBProcessesTest.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/GDBProcessesTest.java index 9d35c7b80f9..1dc8ef52ef5 100644 --- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/GDBProcessesTest.java +++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/GDBProcessesTest.java @@ -20,19 +20,16 @@ import java.util.regex.Pattern; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; -import org.eclipse.cdt.dsf.concurrent.ThreadSafeAndProhibitedFromDsfExecutor; -import org.eclipse.cdt.dsf.datamodel.DMContexts; -import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext; import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMData; -import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl; import org.eclipse.cdt.dsf.mi.service.IMIProcesses; import org.eclipse.cdt.dsf.service.DsfServicesTracker; import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.cdt.tests.dsf.gdb.framework.AsyncCompletionWaitor; import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner; import org.eclipse.cdt.tests.dsf.gdb.framework.BaseTestCase; +import org.eclipse.cdt.tests.dsf.gdb.framework.SyncUtil; import org.eclipse.cdt.tests.dsf.gdb.launching.TestsPlugin; import org.junit.After; import org.junit.Assert; @@ -56,7 +53,6 @@ public class GDBProcessesTest extends BaseTestCase { private DsfSession fSession; private DsfServicesTracker fServicesTracker; - private IGDBControl fGdbCtrl; private IMIProcesses fProcService; /* @@ -73,7 +69,6 @@ public class GDBProcessesTest extends BaseTestCase { * Get the GDBProcesses & MIRunControl service. */ fProcService = fServicesTracker.getService(IMIProcesses.class); - fGdbCtrl = fServicesTracker.getService(IGDBControl.class); } @After @@ -112,7 +107,7 @@ public class GDBProcessesTest extends BaseTestCase { * Ask the service to get model data for the process. * There is only one process in case of GDB back end. */ - final IProcessDMContext processContext = getProcessContext(); + final IProcessDMContext processContext = SyncUtil.getProcessContext(); fSession.getExecutor().submit(new Runnable() { public void run() { fProcService.getExecutionData(processContext, rm); @@ -151,7 +146,7 @@ public class GDBProcessesTest extends BaseTestCase { }; - final IProcessDMContext processContext = getProcessContext(); + final IProcessDMContext processContext = SyncUtil.getProcessContext(); fProcService.getExecutor().submit(new Runnable() { public void run() { IThreadDMContext threadDmc = fProcService.createThreadContext(processContext, THREAD_ID); @@ -175,48 +170,4 @@ public class GDBProcessesTest extends BaseTestCase { fWait.waitReset(); } - - /** - * Utility method to return the process DM context. These tests launch a - * single process, thus only one such context is available. - * - *

- * This must not be called from the DSF executor. - * - * @return the process context - * @throws InterruptedException - */ - @ThreadSafeAndProhibitedFromDsfExecutor("fSession.getExecutor()") - private IProcessDMContext getProcessContext() throws InterruptedException { - assert !fSession.getExecutor().isInExecutorThread(); - - final AsyncCompletionWaitor waitor = new AsyncCompletionWaitor(); - - fProcService.getExecutor().submit(new Runnable() { - public void run() { - fProcService.getProcessesBeingDebugged(fGdbCtrl.getContext(), new DataRequestMonitor(fSession.getExecutor(), null) { - @Override - protected void handleCompleted() { - if (isSuccess()) { - IDMContext[] contexts = getData(); - Assert.assertNotNull("invalid return value from service", contexts); - Assert.assertEquals("unexpected number of processes", contexts.length, 1); - IDMContext context = contexts[0]; - IProcessDMContext processContext = DMContexts.getAncestorOfType(context, IProcessDMContext.class); - Assert.assertNotNull("unexpected process context type ", processContext); - waitor.setReturnInfo(processContext); - } - } - - }); - } - }); - - - - - waitor.waitUntilDone(TestsPlugin.massageTimeout(2000)); - Assert.assertTrue(fWait.getMessage(), fWait.isOK()); - return (IProcessDMContext) waitor.getReturnInfo(); - } } diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java index 41c2e8e8f53..8293c14db6a 100644 --- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java +++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java @@ -23,9 +23,6 @@ import java.util.LinkedList; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; -import org.eclipse.cdt.dsf.concurrent.ThreadSafeAndProhibitedFromDsfExecutor; -import org.eclipse.cdt.dsf.datamodel.DMContexts; -import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl; @@ -172,49 +169,6 @@ public class MIRunControlTest extends BaseTestCase { } } } - - /** - * Utility method to return the process DM context. These tests launch a - * single process, thus only one such context is available. - * - *

- * This must not be called from the DSF executor. - * - * @return the process context - * @throws InterruptedException - */ - @ThreadSafeAndProhibitedFromDsfExecutor("fSession.getExecutor()") - private IProcessDMContext getProcessContext() throws InterruptedException { - assert !fRunCtrl.getExecutor().isInExecutorThread(); - - final AsyncCompletionWaitor waitor = new AsyncCompletionWaitor(); - - fRunCtrl.getExecutor().submit(new Runnable() { - public void run() { - fProcService.getProcessesBeingDebugged(fGDBCtrl.getContext(), new DataRequestMonitor(fRunCtrl.getExecutor(), null) { - @Override - protected void handleCompleted() { - if (isSuccess()) { - IDMContext[] contexts = getData(); - Assert.assertNotNull("invalid return value from service", contexts); - Assert.assertEquals("unexpected number of processes", contexts.length, 1); - IDMContext context = contexts[0]; - IProcessDMContext processContext = DMContexts.getAncestorOfType(context, IProcessDMContext.class); - Assert.assertNotNull("unexpected process context type ", processContext); - waitor.setReturnInfo(processContext); - } - } - - }); - } - }); - - - - waitor.waitUntilDone(TestsPlugin.massageTimeout(2000)); - Assert.assertTrue(waitor.getMessage(), waitor.isOK()); - return (IProcessDMContext) waitor.getReturnInfo(); - } /* * For Multi-threaded application - In case of one thread, Thread id should start with 1. @@ -236,7 +190,7 @@ public class MIRunControlTest extends BaseTestCase { } }; - final IProcessDMContext processContext = getProcessContext(); + final IProcessDMContext processContext = SyncUtil.getProcessContext(); /* * Test getExecutionContexts() when only one thread exist. @@ -324,7 +278,7 @@ public class MIRunControlTest extends BaseTestCase { Assert.assertEquals("Thread created event is for wrong thread id", sProgramIsCygwin ? 3 : 2, ((IMIExecutionDMContext)startedEvent.getDMContext()).getThreadId()); - final IProcessDMContext processContext = getProcessContext(); + final IProcessDMContext processContext = SyncUtil.getProcessContext(); /* * Test getExecutionContexts for a valid container DMC @@ -382,7 +336,7 @@ public class MIRunControlTest extends BaseTestCase { } }; - final IProcessDMContext processContext = getProcessContext(); + final IProcessDMContext processContext = SyncUtil.getProcessContext(); /* * Call getModelData for Execution DMC @@ -616,7 +570,7 @@ public class MIRunControlTest extends BaseTestCase { getGDBLaunch().getSession(), IResumedDMEvent.class); - final IProcessDMContext processContext = getProcessContext(); + final IProcessDMContext processContext = SyncUtil.getProcessContext(); fRunCtrl.getExecutor().submit(new Runnable() { public void run() { @@ -687,7 +641,7 @@ public class MIRunControlTest extends BaseTestCase { wait.waitReset(); - final IProcessDMContext processContext = getProcessContext(); + final IProcessDMContext processContext = SyncUtil.getProcessContext(); fRunCtrl.getExecutor().submit(new Runnable() { public void run() { @@ -733,7 +687,7 @@ public class MIRunControlTest extends BaseTestCase { return; } - final IProcessDMContext processContext = getProcessContext(); + final IProcessDMContext processContext = SyncUtil.getProcessContext(); fRunCtrl.getExecutor().submit(new Runnable() { public void run() {