mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Centralize new method to get heavyweight process context
This commit is contained in:
parent
2964ed425e
commit
92f88c096c
3 changed files with 62 additions and 104 deletions
|
@ -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.
|
||||
*
|
||||
* <p>
|
||||
* 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<IDMContext[]>(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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
* <p>
|
||||
* 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<IDMContext[]>(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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
* <p>
|
||||
* 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<IDMContext[]>(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() {
|
||||
|
|
Loading…
Add table
Reference in a new issue