package st.gravel.support.jvm.debugger; import java.util.concurrent.Semaphore; import com.sun.jdi.BooleanValue; import com.sun.jdi.Method; import com.sun.jdi.ObjectReference; import com.sun.jdi.ThreadReference; import com.sun.jdi.VirtualMachine; import com.sun.jdi.event.ExceptionEvent; public class VMRemoteProcess extends VMRemoteInstance implements VMProcess { private ThreadReference thread; private VMRemoteTarget target; private boolean isUnderDebug; private Semaphore debugOrAnswerSema = new Semaphore(0); public VMRemoteProcess(VMRemoteTarget target, ThreadReference thread, ObjectReference localProcess) { super(localProcess); this.target = target; this.thread = thread; } @Override public boolean isFinished() throws Throwable { return ((BooleanValue) invokeMethod("isFinished")).booleanValue(); } @Override public Object getValue() throws Throwable { return invokeMethod("getValue"); } @Override public Thread thread() { throw new RuntimeException("niy"); } @Override protected int debugPort() { return target.debugPort(); } @Override protected ThreadReference bootThread() { return target.bootThread(); } @Override protected VirtualMachine vm() { return target.vm(); } @Override public boolean isUnderDebug() throws Throwable { return isUnderDebug; } public void processExceptionEvent(ExceptionEvent exEvent) { isUnderDebug = true; debugOrAnswerSema.release(); } @Override public Object getValueOrDebug() throws Throwable { final Object[] value = new Object[] { null }; new Thread(new Runnable() { @Override public void run() { try { value[0] = getValue(); debugOrAnswerSema.release(); } catch (Throwable e) { throw new RuntimeException(e); } } }).start(); debugOrAnswerSema.acquire(); return value[0]; } }