**********************************************************************/
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 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.IThread;
-import net.sourceforge.phpdt.internal.debug.core.PHPDebugCorePlugin;
-import net.sourceforge.phpdt.internal.debug.core.PHPDBGProxy;
-
/**
* 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];
}
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;
}
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) {
getPHPDBGProxy().stop();
}
}
+ } else if (event.getKind() == DebugEvent.SUSPEND) {
+ getPHPDBGProxy().pause();
}
}
}