blob: ad632d63bc1d8771a3c462773a80f2a10af4615e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 The Regents of the University of California.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, 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
*
* LA-CC 04-115
*******************************************************************************/
package org.eclipse.ptp.debug.internal.core;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.ptp.core.IPTPLaunchConfigurationConstants;
import org.eclipse.ptp.core.attributes.IAttribute;
import org.eclipse.ptp.core.elementcontrols.IPJobControl;
import org.eclipse.ptp.core.elementcontrols.IPProcessControl;
import org.eclipse.ptp.core.elements.IPJob;
import org.eclipse.ptp.core.elements.IPProcess;
import org.eclipse.ptp.core.elements.attributes.ProcessAttributes;
import org.eclipse.ptp.core.util.BitList;
import org.eclipse.ptp.debug.core.IPBreakpointManager;
import org.eclipse.ptp.debug.core.IPMemoryManager;
import org.eclipse.ptp.debug.core.IPRegisterManager;
import org.eclipse.ptp.debug.core.IPSession;
import org.eclipse.ptp.debug.core.IPSetManager;
import org.eclipse.ptp.debug.core.IPSignalManager;
import org.eclipse.ptp.debug.core.PTPDebugCorePlugin;
import org.eclipse.ptp.debug.core.event.IPDebugEvent;
import org.eclipse.ptp.debug.core.event.IPDebugInfo;
import org.eclipse.ptp.debug.core.event.PDebugErrorInfo;
import org.eclipse.ptp.debug.core.event.PDebugEvent;
import org.eclipse.ptp.debug.core.event.PDebugExitInfo;
import org.eclipse.ptp.debug.core.event.PDebugInfo;
import org.eclipse.ptp.debug.core.event.PDebugSuspendInfo;
import org.eclipse.ptp.debug.core.launch.IPLaunch;
import org.eclipse.ptp.debug.core.pdi.IPDILocator;
import org.eclipse.ptp.debug.core.pdi.IPDISession;
import org.eclipse.ptp.debug.core.pdi.IPDISessionObject;
import org.eclipse.ptp.debug.core.pdi.PDIException;
import org.eclipse.ptp.debug.core.pdi.event.IPDIBreakpointInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIChangedEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDIConnectedEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDICreatedEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDIDestroyedEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDIDisconnectedEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDIEndSteppingRangeInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIErrorEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDIErrorInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDIEventListener;
import org.eclipse.ptp.debug.core.pdi.event.IPDIExitInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIFunctionFinishedInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDILocationReachedInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIMemoryBlockInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIRegisterInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIRestartedEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDIResumedEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDISharedLibraryInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDISignalInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIStartedEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDISuspendedEvent;
import org.eclipse.ptp.debug.core.pdi.event.IPDIThreadInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIVariableInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIWatchpointScopeInfo;
import org.eclipse.ptp.debug.core.pdi.event.IPDIWatchpointTriggerInfo;
import org.eclipse.ptp.debug.core.pdi.manager.IPDITaskManager;
import org.eclipse.ptp.debug.core.pdi.model.IPDIBreakpoint;
import org.eclipse.ptp.debug.core.pdi.model.IPDILocationBreakpoint;
import org.eclipse.ptp.debug.core.pdi.model.IPDITarget;
import org.eclipse.ptp.debug.internal.core.model.PDebugTarget;
public class PSession implements IPSession, IPDIEventListener {
private final IPDISession pdiSession;
private final IPLaunch launch;
private final IProject project;
private final PSignalManager signalMgr;
private final PBreakpointManager bptMgr;
private final PMemoryManager memMgr;
private final PRegisterManager regMgr;
private final PSetManager setMgr;
public PSession(IPDISession pdiSession, IPLaunch launch, IProject project) {
this.pdiSession = pdiSession;
this.launch = launch;
this.project = project;
signalMgr = new PSignalManager(this);
bptMgr = new PBreakpointManager(this);
memMgr = new PMemoryManager(this);
regMgr = new PRegisterManager(this);
setMgr = new PSetManager(this);
getPDISession().getEventManager().addEventListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#dispose()
*/
public void dispose() {
dispose(false);
}
/**
* @param force
*/
private void dispose(final boolean force) {
WorkspaceJob aJob = new WorkspaceJob("Disposing session...") {
public IStatus runInWorkspace(IProgressMonitor monitor) {
signalMgr.dispose(monitor);
bptMgr.dispose(monitor);
memMgr.dispose(monitor);
regMgr.dispose(monitor);
setMgr.dispose(monitor);
deleteDebugTargets(true);
getPDISession().getEventManager().removeEventListener(PSession.this);
getPDISession().shutdown(force);
return Status.OK_STATUS;
}
};
aJob.setSystem(true);
aJob.schedule();
}
/**
* @param monitor
* @throws CoreException
*/
public void connectToDebugger(IProgressMonitor monitor, String app, String path, String cwd, String[] args) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
boolean failed = false;
try {
getPDISession().connectToDebugger(monitor, app, path, cwd, args);
} catch (PDIException e) {
failed = true;
throw new CoreException(new Status(IStatus.ERROR, PTPDebugCorePlugin.getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), null));
}
finally {
if (failed || monitor.isCanceled()) {
dispose();
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getSetManager()
*/
public IPSetManager getSetManager() {
return setMgr;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getSignalManager()
*/
public IPSignalManager getSignalManager() {
return signalMgr;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getBreakpointManager()
*/
public IPBreakpointManager getBreakpointManager() {
return bptMgr;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getRegisterManager()
*/
public IPRegisterManager getRegisterManager() {
return regMgr;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getMemoryManager()
*/
public IPMemoryManager getMemoryManager() {
return memMgr;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/
@SuppressWarnings("unchecked")
public Object getAdapter(Class adapter) {
if (adapter.equals(IPDISession.class))
return this;
if (adapter.equals(PSignalManager.class))
return getSignalManager();
return null;
}
/**
* @param eTasks
* @return
*/
public IPDebugInfo getDebugInfo(BitList eTasks) {
IPDITaskManager taskMgr = getPDISession().getTaskManager();
return new PDebugInfo(getJob(), eTasks, taskMgr.getRegisteredTasks(eTasks.copy()), taskMgr.getUnregisteredTasks(eTasks.copy()));
}
/****************************************
* IPDIEventListener
****************************************/
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.pdi.event.IPDIEventListener#handleDebugEvents(org.eclipse.ptp.debug.core.pdi.event.IPDIEvent[])
*/
public void handleDebugEvents(IPDIEvent[] events) {
for (IPDIEvent event : events) {
if (event instanceof IPDIConnectedEvent) {
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(getSession(), IPDebugEvent.CREATE, IPDebugEvent.DEBUGGER, getDebugInfo(event.getTasks())));
} else if (event instanceof IPDIStartedEvent) {
//only call once
bptMgr.setInitialBreakpoints();
boolean stopInMain = true;
try {
stopInMain = getLaunch().getLaunchConfiguration().getAttribute(IPTPLaunchConfigurationConstants.ATTR_STOP_IN_MAIN, false);
}
catch (CoreException e) {
//do nothing
}
try {
if (stopInMain) {
bptMgr.setStopInMain(getPDISession().getTasks());
}
getPDISession().start(getPDISession().getTasks());
getPDISession().setStatus(IPDISession.STARTED);
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(getSession(), IPDebugEvent.CHANGE, IPDebugEvent.PROCESS_SPECIFIC, getDebugInfo(event.getTasks())));
} catch (PDIException e) {
IPDebugInfo errInfo = new PDebugErrorInfo(getDebugInfo(event.getTasks()), "Starting processes error!", e.getMessage(), PTPDebugCorePlugin.INTERNAL_ERROR);
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(this, IPDebugEvent.ERROR, IPDebugEvent.UNSPECIFIED, errInfo));
}
} else if (event instanceof IPDIDisconnectedEvent) {
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(getSession(), IPDebugEvent.TERMINATE, IPDebugEvent.DEBUGGER, getDebugInfo(event.getTasks())));
dispose();
} else if (event instanceof IPDIChangedEvent) {
fireChangeEvent((IPDIChangedEvent)event);
} else if (event instanceof IPDICreatedEvent) {
fireCreateEvent((IPDICreatedEvent)event);
} else if (event instanceof IPDIDestroyedEvent) {
fireDestroyEvent((IPDIDestroyedEvent)event);
} else if (event instanceof IPDIErrorEvent) {
fireErrorEvent((IPDIErrorEvent)event);
} else if (event instanceof IPDIRestartedEvent) {
//TODO
} else if (event instanceof IPDIResumedEvent) {
fireResumeEvent((IPDIResumedEvent)event);
} else if (event instanceof IPDISuspendedEvent) {
try {
bptMgr.updatePendingBreakpoints();
} catch (PDIException e) {
}
fireSuspendEvent((IPDISuspendedEvent)event);
} else {
IPDebugEvent debugEvent = new PDebugEvent(this, IPDebugEvent.UNSPECIFIED, IPDebugEvent.UNSPECIFIED, getDebugInfo(event.getTasks()));
PTPDebugCorePlugin.getDefault().fireDebugEvent(debugEvent);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#forceStoppedDebugger(org.eclipse.ptp.core.elements.attributes.ProcessAttributes.State)
*/
public void forceStoppedDebugger(ProcessAttributes.State state) {
BitList tasks = getTasks();
changeProcessState(tasks, state);
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(getSession(), IPDebugEvent.TERMINATE, IPDebugEvent.DEBUGGER, getDebugInfo(tasks)));
dispose(true);
}
/**
* @param tasks
* @param state
*/
private void changeProcessState(BitList tasks, ProcessAttributes.State state) {
IPJob job = getJob();
List<IPProcessControl> processes = new ArrayList<IPProcessControl>();
for (int task : tasks.toArray()) {
IPProcess p = job.getProcessByIndex(task);
if (p instanceof IPProcessControl) {
processes.add((IPProcessControl)p);
}
}
((IPJobControl)job).addProcessAttributes(processes, new IAttribute[] { ProcessAttributes.getStateAttributeDefinition().create(state) });
}
/**
* @param event
*/
public void fireSuspendEvent(IPDISuspendedEvent event) {
/*
try {
getPDISession().validateStepReturn(event.getTasks().copy());
}
catch (PDIException e) {
IPDebugInfo errInfo = new PDebugErrorInfo(getDebugInfo(e.getTasks()), "Check step return error!", e.getMessage(), PTPDebugCorePlugin.INTERNAL_ERROR);
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(this, IPDebugEvent.ERROR, IPDebugEvent.UNSPECIFIED, errInfo));
}
*/
IPDebugInfo baseInfo = getDebugInfo(event.getTasks());
int detail = IPDebugEvent.UNSPECIFIED;
int lineNumber = 0;
int level = event.getLevel();
int depth = event.getDepth();
String fileName = "";
IPDISessionObject reason = event.getReason();
if (reason instanceof IPDIBreakpointInfo) {
IPDIBreakpoint bpt = ((IPDIBreakpointInfo)reason).getBreakpoint();
if (bpt instanceof IPDILocationBreakpoint) {
IPDILocator locator = ((IPDILocationBreakpoint) bpt).getLocator();
if (locator != null) {
lineNumber = locator.getLineNumber();
fileName += locator.getFile();
detail = IPDebugEvent.BREAKPOINT;
}
}
} else if (reason instanceof IPDIEndSteppingRangeInfo) {
IPDILocator locator = ((IPDIEndSteppingRangeInfo)reason).getLocator();
if (locator != null) {
lineNumber = locator.getLineNumber();
fileName += locator.getFile();
detail = IPDebugEvent.STEP_END;
}
} else if (reason instanceof IPDILocationReachedInfo) {
IPDILocator locator = ((IPDILocationReachedInfo)reason).getLocator();
if (locator != null) {
lineNumber = locator.getLineNumber();
fileName += locator.getFile();
detail = IPDebugEvent.CLIENT_REQUEST;
}
} else if (reason instanceof IPDISignalInfo) {
IPDILocator locator = ((IPDISignalInfo)reason).getLocator();
if (locator != null) {
lineNumber = locator.getLineNumber();
fileName += locator.getFile();
detail = IPDebugEvent.CLIENT_REQUEST;
}
} else if (reason instanceof IPDIFunctionFinishedInfo) {
//TODO
} else if (reason instanceof IPDISharedLibraryInfo) {
//TODO
} else if (reason instanceof IPDIWatchpointScopeInfo) {
//TODO
} else if (reason instanceof IPDIWatchpointTriggerInfo) {
//TODO
}
changeProcessState(event.getTasks(), ProcessAttributes.State.SUSPENDED);
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(getSession(), IPDebugEvent.SUSPEND, detail, new PDebugSuspendInfo(baseInfo, fileName, lineNumber, level, depth)));
}
/**
* @param event
*/
public void fireResumeEvent(IPDIResumedEvent event) {
IPDebugInfo baseInfo = getDebugInfo(event.getTasks());
int detail = IPDebugEvent.UNSPECIFIED;
switch (event.getType()) {
case IPDIResumedEvent.STEP_INTO:
case IPDIResumedEvent.STEP_INTO_INSTRUCTION:
detail = IPDebugEvent.STEP_INTO;
break;
case IPDIResumedEvent.STEP_OVER:
case IPDIResumedEvent.STEP_OVER_INSTRUCTION:
detail = IPDebugEvent.STEP_OVER;
break;
case IPDIResumedEvent.STEP_RETURN:
detail = IPDebugEvent.STEP_RETURN;
break;
}
changeProcessState(event.getTasks(), ProcessAttributes.State.RUNNING);
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(this, IPDebugEvent.RESUME, detail, baseInfo));
}
/**
* @param event
*/
public void fireDestroyEvent(IPDIDestroyedEvent event) {
IPDebugEvent debugEvent = null;
IPDebugInfo baseInfo = getDebugInfo(event.getTasks());
IPDISessionObject reason = event.getReason();
if (reason instanceof IPDIBreakpointInfo) {
} else if (reason instanceof IPDIErrorInfo) {
deleteDebugTarget(baseInfo.getAllRegisteredTasks().copy(), true, true);
IPDebugInfo errInfo = new PDebugErrorInfo(baseInfo, ((IPDIErrorInfo)reason).getMessage(), ((IPDIErrorInfo)reason).getDetailMessage(), ((IPDIErrorInfo)reason).getCode());
debugEvent = new PDebugEvent(this, IPDebugEvent.TERMINATE, IPDebugEvent.ERROR, errInfo);
changeProcessState(event.getTasks(), ProcessAttributes.State.ERROR);
} else if (reason instanceof IPDIExitInfo) {
deleteDebugTarget(baseInfo.getAllRegisteredTasks().copy(), true, true);
IPDebugInfo exitInfo = new PDebugExitInfo(baseInfo, ((IPDIExitInfo)reason).getCode(), "Exited", "Exited");
debugEvent = new PDebugEvent(this, IPDebugEvent.TERMINATE, IPDebugEvent.PROCESS_SPECIFIC, exitInfo);
changeProcessState(event.getTasks(), ProcessAttributes.State.EXITED);
} else if (reason instanceof IPDISignalInfo) {
deleteDebugTarget(baseInfo.getAllRegisteredTasks().copy(), true, true);
IPDebugInfo exitInfo = new PDebugExitInfo(baseInfo, 0, ((IPDISignalInfo)reason).getDescription(), ((IPDISignalInfo)reason).getName());
debugEvent = new PDebugEvent(this, IPDebugEvent.TERMINATE, IPDebugEvent.PROCESS_SPECIFIC, exitInfo);
changeProcessState(event.getTasks(), ProcessAttributes.State.EXITED_SIGNALLED);
} else if (reason instanceof IPDISharedLibraryInfo) {
//TODO
} else if (reason instanceof IPDIThreadInfo) {
//TODO
} else if (reason instanceof IPDIVariableInfo) {
//TODO
} else {
debugEvent = new PDebugEvent(this, IPDebugEvent.TERMINATE, IPDebugEvent.UNSPECIFIED, baseInfo);
}
PTPDebugCorePlugin.getDefault().fireDebugEvent(debugEvent);
}
/**
* @param event
*/
public void fireErrorEvent(IPDIErrorEvent event) {
IPDebugInfo baseInfo = getDebugInfo(event.getTasks());
int detail = IPDebugEvent.UNSPECIFIED;
IPDISessionObject reason = event.getReason();
if (reason instanceof IPDIErrorInfo) {
int code = ((IPDIErrorInfo)reason).getCode();
switch (code) {
case IPDIErrorInfo.DBG_FATAL:
detail = IPDebugEvent.ERR_FATAL;
//only fatal error reports process error
changeProcessState(event.getTasks(), ProcessAttributes.State.ERROR);
break;
case IPDIErrorInfo.DBG_WARNING:
detail = IPDebugEvent.ERR_WARNING;
break;
case IPDIErrorInfo.DBG_IGNORE:
case IPDIErrorInfo.DBG_NORMAL:
detail = IPDebugEvent.ERR_NORMAL;
break;
}
IPDebugInfo errInfo = new PDebugErrorInfo(baseInfo, ((IPDIErrorInfo)reason).getMessage(), ((IPDIErrorInfo)reason).getDetailMessage(), ((IPDIErrorInfo)reason).getCode());
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(this, IPDebugEvent.ERROR, detail, errInfo));
} else {
IPDebugInfo errInfo = new PDebugErrorInfo(baseInfo, "Internal Error!", "Unknown", PTPDebugCorePlugin.INTERNAL_ERROR);
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(this, IPDebugEvent.ERROR, IPDebugEvent.UNSPECIFIED, errInfo));
}
}
/**
* @param event
*/
public void fireChangeEvent(IPDIChangedEvent event) {
IPDebugInfo baseInfo = getDebugInfo(event.getTasks());
int detail = IPDebugEvent.UNSPECIFIED;
IPDISessionObject reason = event.getReason();
if (reason instanceof IPDIBreakpointInfo) {
} else if (reason instanceof IPDIMemoryBlockInfo) {
//TODO
} else if (reason instanceof IPDISignalInfo) {
//TODO
} else if (reason instanceof IPDIVariableInfo) {
//TODO
}
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(this, IPDebugEvent.CHANGE, detail, baseInfo));
}
/**
* @param event
*/
public void fireCreateEvent(IPDICreatedEvent event) {
IPDebugInfo baseInfo = getDebugInfo(event.getTasks());
int detail = IPDebugEvent.UNSPECIFIED;
IPDISessionObject reason = event.getReason();
if (reason instanceof IPDIBreakpointInfo) {
} else if (reason instanceof IPDIThreadInfo) {
} else if (reason instanceof IPDIMemoryBlockInfo) {
} else if (reason instanceof IPDIRegisterInfo) {
} else if (reason instanceof IPDISharedLibraryInfo) {
} else if (reason instanceof IPDIVariableInfo) {
} else {
}
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(this, IPDebugEvent.CREATE, detail, baseInfo));
}
/**
* @param type
* @param details
* @param info
*/
public void fireDebugEvent(int type, int details, IPDebugInfo info) {
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(this, type, details, info));
}
/**
* @param type
* @param details
* @param tasks
*/
public void fireDebugEvent(int type, int details, BitList tasks) {
PTPDebugCorePlugin.getDefault().fireDebugEvent(new PDebugEvent(this, type, details, getDebugInfo(tasks)));
}
/**
* @return
*/
public IPSession getSession() {
return this;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getPDISession()
*/
public IPDISession getPDISession() {
return pdiSession;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getJob()
*/
public IPJob getJob() {
return getLaunch().getPJob();
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getLaunch()
*/
public IPLaunch getLaunch() {
return launch;
}
/**
* @return
*/
public IProject getProject() {
return project;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#findDebugTarget(org.eclipse.ptp.core.util.BitList)
*/
public PDebugTarget findDebugTarget(BitList tasks) {
return (PDebugTarget)launch.getDebugTarget(tasks);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getTasks(int)
*/
public BitList getTasks(int id) {
int max = getPDISession().getTotalTasks();
BitList tasks = new BitList(max);
if (id >= 0 && id <= max)
tasks.set(id);
return tasks;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#getTasks()
*/
public BitList getTasks() {
return getPDISession().getTasks();
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#isReady()
*/
public boolean isReady() {
return (getPDISession().getStatus() == IPDISession.STARTED);
}
/****************************************
* register / unregister
****************************************/
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#deleteDebugTargets(boolean)
*/
public void deleteDebugTargets(boolean register) {
if (isReady()) {
BitList tasks = getPDISession().getTaskManager().getRegisteredTasks().copy();
deleteDebugTarget(tasks, true, register);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#reloadDebugTargets(org.eclipse.ptp.core.util.BitList, boolean, boolean)
*/
public void reloadDebugTargets(BitList tasks, boolean refresh, boolean register) {
if (isReady()) {
BitList curRegTasks = getPDISession().getTaskManager().getRegisteredTasks(tasks.copy());
BitList othRegTasks = getPDISession().getTaskManager().getRegisteredTasks().copy();
othRegTasks.andNot(curRegTasks);
deleteDebugTarget(othRegTasks, refresh, register);
createDebugTarget(curRegTasks, refresh, register);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#createDebugTarget(org.eclipse.ptp.core.util.BitList, boolean, boolean)
*/
public void createDebugTarget(BitList tasks, boolean refresh, boolean register) {
if (isReady()) {
List<IPDITarget> targets = new ArrayList<IPDITarget>();
int[] task_array = tasks.toArray();
for (int task_id : task_array) {
IPDITarget target = getPDISession().getTargetManager().addTarget(getTasks(task_id));
if (target != null) {
targets.add(target);
}
else {
tasks.clear(task_id);
}
}
if (register)
getPDISession().getTaskManager().setRegisterTasks(true, tasks);
PTPDebugCorePlugin.getDebugModel().addNewDebugTargets(getLaunch(), tasks, targets.toArray(new IPDITarget[0]), refresh, false);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.debug.core.IPSession#deleteDebugTarget(org.eclipse.ptp.core.util.BitList, boolean, boolean)
*/
public void deleteDebugTarget(BitList tasks, boolean refresh, boolean register) {
int[] task_array = tasks.toArray();
for (int task_id : task_array) {
if (!getPDISession().getTargetManager().removeTarget(getTasks(task_id))) {
tasks.clear(task_id);
}
}
if (register)
getPDISession().getTaskManager().setRegisterTasks(false, tasks);
PTPDebugCorePlugin.getDebugModel().removeDebugTarget(getLaunch(), tasks, refresh);
}
}