**********************************************************************/
package net.sourceforge.phpdt.internal.debug.core.model;
+import net.sourceforge.phpdt.internal.debug.core.PHPDBGProxy;
+import net.sourceforge.phpdt.internal.debug.core.PHPDebugCorePlugin;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IMemoryBlock;
import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
-
-import net.sourceforge.phpdt.internal.debug.core.PHPDebugCorePlugin;
-import net.sourceforge.phpdt.internal.debug.core.PHPDBGProxy;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.model.IWorkbenchAdapter;
/**
* Debug target for PHP debug model.
private IProcess process;
private boolean isTerminated;
+ private boolean isSuspended;
private ILaunch launch;
private PHPThread[] threads;
private PHPDBGProxy phpDBGProxy;
public PHPDebugTarget(ILaunch launch, IProcess process) {
+ this.isSuspended = false;
this.launch = launch;
this.process = process;
this.threads = new PHPThread[0];
+ // TODO XXX remove breakpoint listener at termination to avoid live leak
IBreakpointManager manager= DebugPlugin.getDefault().getBreakpointManager();
manager.addBreakpointListener(this);
DebugPlugin.getDefault().addDebugEventListener(this);
threads = updatedThreads;
fireChangeEvent();
+ fireThreadCreateEvent(phpThread);
}
private void fireChangeEvent() {
DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { ev });
}
+ private void fireThreadCreateEvent(PHPThread phpThread) {
+ DebugEvent ev = new DebugEvent(phpThread, DebugEvent.CREATE);
+ DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] { ev });
+ }
+
protected PHPThread getThreadById(int id) {
for (int i = 0; i < threads.length; i++) {
if (threads[i].getId() == id) {
}
public boolean supportsBreakpoint(IBreakpoint arg0) {
+ if(arg0.getModelIdentifier().equals(PHPDebugCorePlugin.PLUGIN_ID)) {
+ return true;
+ }
return false;
}
public String getModelIdentifier() {
- return PHPDebugCorePlugin.getUniqueIdentifier();
+ return PHPDebugCorePlugin.PLUGIN_ID;
}
public IDebugTarget getDebugTarget() {
return isTerminated;
}
- public void terminate() {
+ public synchronized void terminate() {
+ // This method is synchronized to control a race condition between the
+ // UI thread that terminates the debugging session, and the slave
+ // thread that executes PHPLoop.run
+ if (isTerminated)
+ // Avoid terminating twice...
+ return;
phpDBGProxy.stop();
this.threads = new PHPThread[0];
isTerminated = true;
fireChangeEvent();
+ IBreakpointManager manager= DebugPlugin.getDefault().getBreakpointManager();
+ manager.removeBreakpointListener(this);
+ DebugPlugin.getDefault().removeDebugEventListener(this);
}
public boolean canResume() {
- return false;
+ if(isTerminated) return false;
+ return isSuspended;
}
public boolean canSuspend() {
- return false;
+ if(isTerminated) return false;
+ return !isSuspended;
}
public boolean isSuspended() {
- return false;
+ return isSuspended;
}
public void resume() throws DebugException {
+ this.getPHPDBGProxy().resume();
+ isSuspended= false;
}
public void suspend() throws DebugException {
+ this.getPHPDBGProxy().pause();
+ isSuspended= true;
}
public void breakpointAdded(IBreakpoint breakpoint) {
}
public Object getAdapter(Class arg0) {
+ if (IWorkbenchAdapter.class.equals(arg0)) {
+ return new IWorkbenchAdapter() {
+ public Object[] getChildren(Object o) {
+ Object[] children = null;
+ IThread[] threads = getThreads();
+ if (null != threads) {
+ children = new Object[threads.length];
+ for (int i = 0; i < threads.length; ++i)
+ children[i] = threads[i];
+ }
+ return children;
+ }
+ public ImageDescriptor getImageDescriptor(Object object) {
+ return null;
+ }
+ public String getLabel(Object o) {
+ String label = "(Unable to look up name... check error log)";
+ try {
+ label = getName();
+ } catch (DebugException x) {
+ PHPeclipsePlugin.log(label, x);
+ }
+ return label;
+ }
+ public Object getParent(Object o) {
+ return PHPDebugTarget.this.getLaunch();
+ }
+ };
+ }
return null;
}
getPHPDBGProxy().stop();
}
}
+ } else if (event.getKind() == DebugEvent.SUSPEND) {
+ getPHPDBGProxy().pause();
}
}
}