mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-02 22:05:44 +02:00
2004-09-22 Alain Magloire
Makes the mi/ source folder independant of the cdt.core so we can make it a library. To many files to enumerate
This commit is contained in:
parent
dfaa0dad02
commit
de94789d8d
25 changed files with 398 additions and 124 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2004-09-22 Alain Magloire
|
||||||
|
Makes the mi/ source folder independant of the cdt.core
|
||||||
|
so we can make it a library.
|
||||||
|
To many files to enumerate
|
||||||
|
|
||||||
2004-09-17 Alain Magloire
|
2004-09-17 Alain Magloire
|
||||||
Support for 64 bits application
|
Support for 64 bits application
|
||||||
PR 74056 74058. Pathc from Artyom Kuanbekov
|
PR 74056 74058. Pathc from Artyom Kuanbekov
|
||||||
|
|
|
@ -12,8 +12,8 @@ package org.eclipse.cdt.debug.mi.core.cdi;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.cdi.ICDIConfiguration;
|
import org.eclipse.cdt.debug.core.cdi.ICDIConfiguration;
|
||||||
import org.eclipse.cdt.debug.mi.core.MIInferior;
|
import org.eclipse.cdt.debug.mi.core.MIInferior;
|
||||||
|
import org.eclipse.cdt.debug.mi.core.MIProcess;
|
||||||
import org.eclipse.cdt.debug.mi.core.MISession;
|
import org.eclipse.cdt.debug.mi.core.MISession;
|
||||||
import org.eclipse.cdt.utils.spawner.Spawner;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -125,8 +125,9 @@ public class Configuration implements ICDIConfiguration {
|
||||||
os = System.getProperty("os.name", ""); //$NON-NLS-1$ //$NON-NLS-2$
|
os = System.getProperty("os.name", ""); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
}
|
}
|
||||||
Process gdb = miSession.getGDBProcess();
|
MIProcess gdb = miSession.getGDBProcess();
|
||||||
if (gdb instanceof Spawner) {
|
MIInferior inferior = miSession.getMIInferior();
|
||||||
|
if (gdb.canInterrupt(inferior)) {
|
||||||
// If we attached sending a control-c,
|
// If we attached sending a control-c,
|
||||||
// seems to alays work.
|
// seems to alays work.
|
||||||
if (fAttached) {
|
if (fAttached) {
|
||||||
|
@ -136,8 +137,7 @@ public class Configuration implements ICDIConfiguration {
|
||||||
// If we have a pty, sending a control-c will work
|
// If we have a pty, sending a control-c will work
|
||||||
// except for solaris.
|
// except for solaris.
|
||||||
if (os.equals("SunOS")) { //$NON-NLS-1$
|
if (os.equals("SunOS")) { //$NON-NLS-1$
|
||||||
MIInferior inferior = miSession.getMIInferior();
|
if (inferior.getTTY() != null) {
|
||||||
if (inferior.getPTY() != null) {
|
|
||||||
// FIXME: bug in Solaris gdb when using -tty, sending a control-c
|
// FIXME: bug in Solaris gdb when using -tty, sending a control-c
|
||||||
// does not work.
|
// does not work.
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.mi.core;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public interface IMITTY {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the name of the slave to pass to gdb --tty command
|
||||||
|
* ex: --tty=/dev/pty/1
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getSlaveName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the OutputStream of the Master.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public OutputStream getOutputStream();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the InputStream of the Master
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public InputStream getInputStream();
|
||||||
|
|
||||||
|
}
|
|
@ -24,8 +24,6 @@ import org.eclipse.cdt.debug.mi.core.command.MIInfoProgram;
|
||||||
import org.eclipse.cdt.debug.mi.core.event.MIInferiorExitEvent;
|
import org.eclipse.cdt.debug.mi.core.event.MIInferiorExitEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIGDBShowExitCodeInfo;
|
import org.eclipse.cdt.debug.mi.core.output.MIGDBShowExitCodeInfo;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIInfoProgramInfo;
|
import org.eclipse.cdt.debug.mi.core.output.MIInfoProgramInfo;
|
||||||
import org.eclipse.cdt.utils.pty.PTY;
|
|
||||||
import org.eclipse.cdt.utils.spawner.Spawner;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -49,16 +47,16 @@ public class MIInferior extends Process {
|
||||||
|
|
||||||
PipedInputStream err;
|
PipedInputStream err;
|
||||||
PipedOutputStream errPiped;
|
PipedOutputStream errPiped;
|
||||||
PTY pty;
|
IMITTY tty;
|
||||||
|
|
||||||
int inferiorPID;
|
int inferiorPID;
|
||||||
|
|
||||||
MIInferior(MISession mi, PTY p) {
|
MIInferior(MISession mi, IMITTY p) {
|
||||||
session = mi;
|
session = mi;
|
||||||
pty = p;
|
tty = p;
|
||||||
if (pty != null) {
|
if (tty != null) {
|
||||||
out = pty.getOutputStream();
|
out = tty.getOutputStream();
|
||||||
in = pty.getInputStream();
|
in = tty.getInputStream();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +179,7 @@ public class MIInferior extends Process {
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void interrupt() throws MIException {
|
public synchronized void interrupt() throws MIException {
|
||||||
Process gdb = session.getGDBProcess();
|
MIProcess gdb = session.getGDBProcess();
|
||||||
// Check if they can handle the interrupt
|
// Check if they can handle the interrupt
|
||||||
// Try the exec-interrupt; this will be for "gdb --async"
|
// Try the exec-interrupt; this will be for "gdb --async"
|
||||||
CommandFactory factory = session.getCommandFactory();
|
CommandFactory factory = session.getCommandFactory();
|
||||||
|
@ -200,26 +198,8 @@ public class MIInferior extends Process {
|
||||||
}
|
}
|
||||||
} catch (MIException e) {
|
} catch (MIException e) {
|
||||||
}
|
}
|
||||||
} else if (gdb instanceof Spawner) {
|
} else if (gdb.canInterrupt(this)) {
|
||||||
Spawner gdbSpawner = (Spawner) gdb;
|
gdb.interrupt(this);
|
||||||
gdbSpawner.interrupt();
|
|
||||||
// Allow (5 secs) for the interrupt to propagate.
|
|
||||||
for (int i = 0;(state == RUNNING) && i < 5; i++) {
|
|
||||||
try {
|
|
||||||
wait(1000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((state == RUNNING) && getInferiorPID() > 0) {
|
|
||||||
// lets try something else.
|
|
||||||
gdbSpawner.raise(getInferiorPID(), gdbSpawner.INT);
|
|
||||||
for (int i = 0;(state == RUNNING) && i < 5; i++) {
|
|
||||||
try {
|
|
||||||
wait(1000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we've failed throw an exception up.
|
// If we've failed throw an exception up.
|
||||||
|
@ -286,9 +266,9 @@ public class MIInferior extends Process {
|
||||||
//e.printStackTrace();
|
//e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If pty is not null then we are using a master/slave terminal
|
// If tty is not null then we are using a master/slave terminal
|
||||||
// emulation close the master to notify the slave.
|
// emulation close the master to notify the slave.
|
||||||
if (pty != null) {
|
if (tty != null) {
|
||||||
if (in != null) {
|
if (in != null) {
|
||||||
try {
|
try {
|
||||||
in.close();
|
in.close();
|
||||||
|
@ -320,8 +300,8 @@ public class MIInferior extends Process {
|
||||||
return errPiped;
|
return errPiped;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PTY getPTY() {
|
public IMITTY getTTY() {
|
||||||
return pty;
|
return tty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.mi.core;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if we can interrupt the inferior.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface MIProcess {
|
||||||
|
|
||||||
|
|
||||||
|
public abstract boolean canInterrupt(MIInferior inferior);
|
||||||
|
|
||||||
|
public abstract void interrupt(MIInferior inferior);
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Process#destroy()
|
||||||
|
*/
|
||||||
|
public void destroy();
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Process#exitValue()
|
||||||
|
*/
|
||||||
|
public int exitValue();
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Process#getErrorStream()
|
||||||
|
*/
|
||||||
|
public InputStream getErrorStream();
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Process#getInputStream()
|
||||||
|
*/
|
||||||
|
public InputStream getInputStream();
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Process#getOutputStream()
|
||||||
|
*/
|
||||||
|
public OutputStream getOutputStream();
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Process#waitFor()
|
||||||
|
*/
|
||||||
|
public int waitFor() throws InterruptedException;
|
||||||
|
|
||||||
|
}
|
|
@ -28,7 +28,6 @@ import org.eclipse.cdt.debug.mi.core.event.MIEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.event.MIGDBExitEvent;
|
import org.eclipse.cdt.debug.mi.core.event.MIGDBExitEvent;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIOutput;
|
import org.eclipse.cdt.debug.mi.core.output.MIOutput;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIParser;
|
import org.eclipse.cdt.debug.mi.core.output.MIParser;
|
||||||
import org.eclipse.cdt.utils.pty.PTY;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a GDB/MI session.
|
* Represents a GDB/MI session.
|
||||||
|
@ -57,7 +56,7 @@ public class MISession extends Observable {
|
||||||
int sessionType;
|
int sessionType;
|
||||||
|
|
||||||
Process sessionProcess;
|
Process sessionProcess;
|
||||||
Process gdbProcess;
|
MIProcess gdbProcess;
|
||||||
InputStream inChannel;
|
InputStream inChannel;
|
||||||
OutputStream outChannel;
|
OutputStream outChannel;
|
||||||
|
|
||||||
|
@ -91,7 +90,7 @@ public class MISession extends Observable {
|
||||||
* @param timeout time in milliseconds to wait for command response.
|
* @param timeout time in milliseconds to wait for command response.
|
||||||
* @param type the type of debugin session.
|
* @param type the type of debugin session.
|
||||||
*/
|
*/
|
||||||
public MISession(Process process, PTY pty, int timeout, int type, int launchTimeout) throws MIException {
|
public MISession(MIProcess process, IMITTY tty, int timeout, int type, int launchTimeout) throws MIException {
|
||||||
|
|
||||||
gdbProcess = process;
|
gdbProcess = process;
|
||||||
inChannel = process.getInputStream();
|
inChannel = process.getInputStream();
|
||||||
|
@ -105,7 +104,7 @@ public class MISession extends Observable {
|
||||||
|
|
||||||
parser = new MIParser();
|
parser = new MIParser();
|
||||||
|
|
||||||
inferior = new MIInferior(this, pty);
|
inferior = new MIInferior(this, tty);
|
||||||
|
|
||||||
txQueue = new CommandQueue();
|
txQueue = new CommandQueue();
|
||||||
rxQueue = new CommandQueue();
|
rxQueue = new CommandQueue();
|
||||||
|
@ -344,7 +343,7 @@ public class MISession extends Observable {
|
||||||
/**
|
/**
|
||||||
* Return the "gdb" Process.
|
* Return the "gdb" Process.
|
||||||
*/
|
*/
|
||||||
public Process getGDBProcess() {
|
public MIProcess getGDBProcess() {
|
||||||
return gdbProcess;
|
return gdbProcess;
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,9 @@ public class CommandFactory {
|
||||||
}
|
}
|
||||||
|
|
||||||
public MIExecInterrupt createMIExecInterrupt() {
|
public MIExecInterrupt createMIExecInterrupt() {
|
||||||
|
// return null here to signal that we do not support
|
||||||
|
// -exec-interrupt and to use to drop a signal to gdb
|
||||||
|
// instead via the MIProcess class
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -146,7 +146,7 @@ public class MICommand extends Command {
|
||||||
return command.toString();
|
return command.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean containsWhitespace(String s) {
|
protected boolean containsWhitespace(String s) {
|
||||||
for (int i = 0; i < s.length(); i++) {
|
for (int i = 0; i < s.length(); i++) {
|
||||||
if (Character.isWhitespace(s.charAt(i))) {
|
if (Character.isWhitespace(s.charAt(i))) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -4,7 +4,11 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.eclipse.cdt.debug.mi.core.command;
|
package org.eclipse.cdt.debug.mi.core;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
|
||||||
|
import org.eclipse.cdt.debug.mi.core.command.MIEnvironmentCD;
|
||||||
|
import org.eclipse.cdt.debug.mi.core.command.MIEnvironmentDirectory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cygwin Command Factory overrides the regular Command Factory to allow for
|
* Cygwin Command Factory overrides the regular Command Factory to allow for
|
|
@ -11,7 +11,6 @@ import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
||||||
import org.eclipse.cdt.debug.mi.core.cdi.Session;
|
import org.eclipse.cdt.debug.mi.core.cdi.Session;
|
||||||
import org.eclipse.cdt.debug.mi.core.cdi.model.Target;
|
import org.eclipse.cdt.debug.mi.core.cdi.model.Target;
|
||||||
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
|
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
|
||||||
import org.eclipse.cdt.debug.mi.core.command.CygwinCommandFactory;
|
|
||||||
import org.eclipse.cdt.debug.mi.core.command.MIGDBSet;
|
import org.eclipse.cdt.debug.mi.core.command.MIGDBSet;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
|
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
|
|
|
@ -9,12 +9,13 @@
|
||||||
* QNX Software Systems - Initial API and implementation
|
* QNX Software Systems - Initial API and implementation
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
package org.eclipse.cdt.debug.mi.core.command;
|
package org.eclipse.cdt.debug.mi.core;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CommandLauncher;
|
import org.eclipse.cdt.core.CommandLauncher;
|
||||||
|
import org.eclipse.cdt.debug.mi.core.command.MIEnvironmentCD;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -63,10 +64,11 @@ public class CygwinMIEnvironmentCD extends MIEnvironmentCD {
|
||||||
* @see org.eclipse.cdt.debug.mi.core.command.MICommand#parametersToString()
|
* @see org.eclipse.cdt.debug.mi.core.command.MICommand#parametersToString()
|
||||||
*/
|
*/
|
||||||
protected String parametersToString() {
|
protected String parametersToString() {
|
||||||
if (parameters != null && parameters.length == 1) {
|
String[] params = getParameters();
|
||||||
|
if (params != null && params.length == 1) {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
// We need to escape the double quotes and the backslash.
|
// We need to escape the double quotes and the backslash.
|
||||||
String param = parameters[0];
|
String param = params[0];
|
||||||
for (int j = 0; j < param.length(); j++) {
|
for (int j = 0; j < param.length(); j++) {
|
||||||
char c = param.charAt(j);
|
char c = param.charAt(j);
|
||||||
if (c == '"' || c == '\\') {
|
if (c == '"' || c == '\\') {
|
|
@ -4,11 +4,12 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.eclipse.cdt.debug.mi.core.command;
|
package org.eclipse.cdt.debug.mi.core;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CommandLauncher;
|
import org.eclipse.cdt.core.CommandLauncher;
|
||||||
|
import org.eclipse.cdt.debug.mi.core.command.MIEnvironmentDirectory;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -10,13 +10,10 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.debug.mi.core;
|
package org.eclipse.cdt.debug.mi.core;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.io.Reader;
|
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.MissingResourceException;
|
import java.util.MissingResourceException;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
@ -29,7 +26,6 @@ import org.eclipse.cdt.debug.mi.core.command.MITargetAttach;
|
||||||
import org.eclipse.cdt.debug.mi.core.command.MITargetSelect;
|
import org.eclipse.cdt.debug.mi.core.command.MITargetSelect;
|
||||||
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
|
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
|
||||||
import org.eclipse.cdt.utils.pty.PTY;
|
import org.eclipse.cdt.utils.pty.PTY;
|
||||||
import org.eclipse.cdt.utils.spawner.ProcessFactory;
|
|
||||||
import org.eclipse.core.runtime.Plugin;
|
import org.eclipse.core.runtime.Plugin;
|
||||||
import org.eclipse.core.runtime.Preferences;
|
import org.eclipse.core.runtime.Preferences;
|
||||||
import org.osgi.framework.BundleContext;
|
import org.osgi.framework.BundleContext;
|
||||||
|
@ -87,7 +83,7 @@ public class MIPlugin extends Plugin {
|
||||||
* @throws MIException
|
* @throws MIException
|
||||||
* @return MISession
|
* @return MISession
|
||||||
*/
|
*/
|
||||||
public MISession createMISession(Process process, PTY pty, int timeout, int type, int launchTimeout) throws MIException {
|
public MISession createMISession(MIProcess process, IMITTY pty, int timeout, int type, int launchTimeout) throws MIException {
|
||||||
return new MISession(process, pty, timeout, type, launchTimeout);
|
return new MISession(process, pty, timeout, type, launchTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +95,7 @@ public class MIPlugin extends Plugin {
|
||||||
* @throws MIException
|
* @throws MIException
|
||||||
* @return MISession
|
* @return MISession
|
||||||
*/
|
*/
|
||||||
public MISession createMISession(Process process, PTY pty, int type) throws MIException {
|
public MISession createMISession(MIProcess process, IMITTY pty, int type) throws MIException {
|
||||||
MIPlugin miPlugin = getDefault();
|
MIPlugin miPlugin = getDefault();
|
||||||
Preferences prefs = miPlugin.getPluginPreferences();
|
Preferences prefs = miPlugin.getPluginPreferences();
|
||||||
int timeout = prefs.getInt(IMIConstants.PREF_REQUEST_TIMEOUT);
|
int timeout = prefs.getInt(IMIConstants.PREF_REQUEST_TIMEOUT);
|
||||||
|
@ -114,11 +110,12 @@ public class MIPlugin extends Plugin {
|
||||||
* @throws MIException
|
* @throws MIException
|
||||||
*/
|
*/
|
||||||
public ICDISession createCSession(String gdb, File program, File cwd, String gdbinit) throws IOException, MIException {
|
public ICDISession createCSession(String gdb, File program, File cwd, String gdbinit) throws IOException, MIException {
|
||||||
PTY pty = null;
|
IMITTY pty = null;
|
||||||
boolean failed = false;
|
boolean failed = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
pty = new PTY();
|
PTY pseudo = new PTY();
|
||||||
|
pty = new MITTYAdapter(pseudo);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,7 +153,7 @@ public class MIPlugin extends Plugin {
|
||||||
* @return ICDISession
|
* @return ICDISession
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public ICDISession createCSession(String gdb, File program, File cwd, String gdbinit, PTY pty) throws IOException, MIException {
|
public ICDISession createCSession(String gdb, File program, File cwd, String gdbinit, IMITTY pty) throws IOException, MIException {
|
||||||
if (gdb == null || gdb.length() == 0) {
|
if (gdb == null || gdb.length() == 0) {
|
||||||
gdb = GDB;
|
gdb = GDB;
|
||||||
}
|
}
|
||||||
|
@ -180,7 +177,7 @@ public class MIPlugin extends Plugin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Process pgdb = getGDBProcess(args);
|
MIProcess pgdb = new MIProcessAdapter(args);
|
||||||
|
|
||||||
MISession session;
|
MISession session;
|
||||||
try {
|
try {
|
||||||
|
@ -231,7 +228,7 @@ public class MIPlugin extends Plugin {
|
||||||
} else {
|
} else {
|
||||||
args = new String[] {gdb, "--cd="+cwd.getAbsolutePath(), "--command="+gdbinit, "--quiet", "-nw", "-i", "mi1", "-c", core.getAbsolutePath(), program.getAbsolutePath()}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
|
args = new String[] {gdb, "--cd="+cwd.getAbsolutePath(), "--command="+gdbinit, "--quiet", "-nw", "-i", "mi1", "-c", core.getAbsolutePath(), program.getAbsolutePath()}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
|
||||||
}
|
}
|
||||||
Process pgdb = getGDBProcess(args);
|
MIProcess pgdb = new MIProcessAdapter(args);
|
||||||
MISession session;
|
MISession session;
|
||||||
try {
|
try {
|
||||||
session = createMISession(pgdb, null, MISession.CORE);
|
session = createMISession(pgdb, null, MISession.CORE);
|
||||||
|
@ -264,7 +261,7 @@ public class MIPlugin extends Plugin {
|
||||||
} else {
|
} else {
|
||||||
args = new String[] {gdb, "--cd="+cwd.getAbsolutePath(), "--command="+gdbinit, "--quiet", "-nw", "-i", "mi1", program.getAbsolutePath()}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
|
args = new String[] {gdb, "--cd="+cwd.getAbsolutePath(), "--command="+gdbinit, "--quiet", "-nw", "-i", "mi1", program.getAbsolutePath()}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
|
||||||
}
|
}
|
||||||
Process pgdb = getGDBProcess(args);
|
MIProcess pgdb = new MIProcessAdapter(args);
|
||||||
MISession session;
|
MISession session;
|
||||||
try {
|
try {
|
||||||
session = createMISession(pgdb, null, MISession.ATTACH);
|
session = createMISession(pgdb, null, MISession.ATTACH);
|
||||||
|
@ -345,68 +342,6 @@ public class MIPlugin extends Plugin {
|
||||||
return '#' + key + '#';
|
return '#' + key + '#';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Do some basic synchronisation, gdb may take some time to load
|
|
||||||
* for whatever reasons.
|
|
||||||
* @param args
|
|
||||||
* @return Process
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
protected Process getGDBProcess(String[] args) throws IOException {
|
|
||||||
if ( getDefault().isDebugging() )
|
|
||||||
{
|
|
||||||
StringBuffer sb = new StringBuffer();
|
|
||||||
for ( int i = 0; i < args.length; ++i )
|
|
||||||
{
|
|
||||||
sb.append( args[i] );
|
|
||||||
sb.append( ' ' );
|
|
||||||
}
|
|
||||||
getDefault().debugLog( sb.toString() );
|
|
||||||
}
|
|
||||||
final Process pgdb = ProcessFactory.getFactory().exec(args);
|
|
||||||
Thread syncStartup = new Thread("GDB Start") { //$NON-NLS-1$
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
String line;
|
|
||||||
InputStream stream = pgdb.getInputStream();
|
|
||||||
Reader r = new InputStreamReader(stream);
|
|
||||||
BufferedReader reader = new BufferedReader(r);
|
|
||||||
while ((line = reader.readLine()) != null) {
|
|
||||||
line = line.trim();
|
|
||||||
//System.out.println("GDB " + line);
|
|
||||||
if (line.endsWith("(gdb)")) { //$NON-NLS-1$
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
synchronized (pgdb) {
|
|
||||||
pgdb.notifyAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
syncStartup.start();
|
|
||||||
|
|
||||||
synchronized (pgdb) {
|
|
||||||
MIPlugin miPlugin = getDefault();
|
|
||||||
Preferences prefs = miPlugin.getPluginPreferences();
|
|
||||||
int launchTimeout = prefs.getInt(IMIConstants.PREF_REQUEST_LAUNCH_TIMEOUT);
|
|
||||||
while (syncStartup.isAlive()) {
|
|
||||||
try {
|
|
||||||
pgdb.wait(launchTimeout);
|
|
||||||
break;
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
syncStartup.interrupt();
|
|
||||||
syncStartup.join(1000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
}
|
|
||||||
return pgdb;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.core.runtime.Plugin#startup()
|
* @see org.eclipse.core.runtime.Plugin#startup()
|
||||||
|
|
|
@ -0,0 +1,193 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.mi.core;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.Reader;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.utils.spawner.ProcessFactory;
|
||||||
|
import org.eclipse.cdt.utils.spawner.Spawner;
|
||||||
|
import org.eclipse.core.runtime.Preferences;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public class MIProcessAdapter implements MIProcess {
|
||||||
|
|
||||||
|
Process fGDBProcess;
|
||||||
|
|
||||||
|
public MIProcessAdapter(String[] args) throws IOException {
|
||||||
|
fGDBProcess = getGDBProcess(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do some basic synchronisation, gdb may take some time to load for
|
||||||
|
* whatever reasons.
|
||||||
|
*
|
||||||
|
* @param args
|
||||||
|
* @return Process
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
protected Process getGDBProcess(String[] args) throws IOException {
|
||||||
|
if (MIPlugin.getDefault().isDebugging()) {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (int i = 0; i < args.length; ++i) {
|
||||||
|
sb.append(args[i]);
|
||||||
|
sb.append(' ');
|
||||||
|
}
|
||||||
|
MIPlugin.getDefault().debugLog(sb.toString());
|
||||||
|
}
|
||||||
|
final Process pgdb = ProcessFactory.getFactory().exec(args);
|
||||||
|
Thread syncStartup = new Thread("GDB Start") { //$NON-NLS-1$
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
String line;
|
||||||
|
InputStream stream = pgdb.getInputStream();
|
||||||
|
Reader r = new InputStreamReader(stream);
|
||||||
|
BufferedReader reader = new BufferedReader(r);
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
line = line.trim();
|
||||||
|
//System.out.println("GDB " + line);
|
||||||
|
if (line.endsWith("(gdb)")) { //$NON-NLS-1$
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
synchronized (pgdb) {
|
||||||
|
pgdb.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
syncStartup.start();
|
||||||
|
|
||||||
|
synchronized (pgdb) {
|
||||||
|
MIPlugin miPlugin = MIPlugin.getDefault();
|
||||||
|
Preferences prefs = miPlugin.getPluginPreferences();
|
||||||
|
int launchTimeout = prefs
|
||||||
|
.getInt(IMIConstants.PREF_REQUEST_LAUNCH_TIMEOUT);
|
||||||
|
while (syncStartup.isAlive()) {
|
||||||
|
try {
|
||||||
|
pgdb.wait(launchTimeout);
|
||||||
|
break;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
syncStartup.interrupt();
|
||||||
|
syncStartup.join(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
}
|
||||||
|
return pgdb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.debug.mi.core.MIProcess#canInterrupt()
|
||||||
|
*/
|
||||||
|
public boolean canInterrupt(MIInferior inferior) {
|
||||||
|
return fGDBProcess instanceof Spawner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.debug.mi.core.MIProcess#interrupt()
|
||||||
|
*/
|
||||||
|
public void interrupt(MIInferior inferior) {
|
||||||
|
if (fGDBProcess instanceof Spawner) {
|
||||||
|
Spawner gdbSpawner = (Spawner) fGDBProcess;
|
||||||
|
gdbSpawner.interrupt();
|
||||||
|
int state;
|
||||||
|
// Allow (5 secs) for the interrupt to propagate.
|
||||||
|
for (int i = 0; inferior.isRunning() && i < 5; i++) {
|
||||||
|
try {
|
||||||
|
wait(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If we are still running try to drop the sig to the PID
|
||||||
|
if (inferior.isRunning() && inferior.getInferiorPID() > 0) {
|
||||||
|
// lets try something else.
|
||||||
|
gdbSpawner.raise(inferior.getInferiorPID(), gdbSpawner.INT);
|
||||||
|
for (int i = 0; inferior.isRunning() && i < 5; i++) {
|
||||||
|
try {
|
||||||
|
wait(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see java.lang.Process#exitValue()
|
||||||
|
*/
|
||||||
|
public int exitValue() {
|
||||||
|
return fGDBProcess.exitValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see java.lang.Process#waitFor()
|
||||||
|
*/
|
||||||
|
public int waitFor() throws InterruptedException {
|
||||||
|
return fGDBProcess.waitFor();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see java.lang.Process#destroy()
|
||||||
|
*/
|
||||||
|
public void destroy() {
|
||||||
|
fGDBProcess.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see java.lang.Process#getErrorStream()
|
||||||
|
*/
|
||||||
|
public InputStream getErrorStream() {
|
||||||
|
return fGDBProcess.getErrorStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see java.lang.Process#getInputStream()
|
||||||
|
*/
|
||||||
|
public InputStream getInputStream() {
|
||||||
|
return fGDBProcess.getInputStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see java.lang.Process#getOutputStream()
|
||||||
|
*/
|
||||||
|
public OutputStream getOutputStream() {
|
||||||
|
return fGDBProcess.getOutputStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2000, 2004 QNX Software Systems and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* QNX Software Systems - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.debug.mi.core;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.utils.pty.PTY;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adapt the PTY code to IMITTY
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class MITTYAdapter implements IMITTY {
|
||||||
|
|
||||||
|
PTY fPty;
|
||||||
|
|
||||||
|
public MITTYAdapter(PTY pty) {
|
||||||
|
fPty = pty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.mi.core.IMITTY#getSlaveName()
|
||||||
|
*/
|
||||||
|
public String getSlaveName() {
|
||||||
|
return fPty.getSlaveName();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.mi.core.IMITTY#getOutputStream()
|
||||||
|
*/
|
||||||
|
public OutputStream getOutputStream() {
|
||||||
|
return fPty.getOutputStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.debug.mi.core.IMITTY#getInputStream()
|
||||||
|
*/
|
||||||
|
public InputStream getInputStream() {
|
||||||
|
return fPty.getInputStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue