blob: c385d1602d7fb81034849e128a52020340c5ab71 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2016 Ericsson and others.
* All rights reserved. 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
*
* Contributors:
* Ericsson - Initial API and implementation
* Marc Khouzam (Ericsson) - Display exit code in process console (Bug 402054)
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.launching;
import java.util.Map;
import org.eclipse.cdt.dsf.gdb.IGdbDebugConstants;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.RuntimeProcess;
import com.ibm.icu.text.MessageFormat;
/**
* A process for the inferior to know it belongs to a DSF-GDB session.
* This class also adds the exit code of the inferior to the console.
*
* Note that this class is also used in Run mode.
*
* @since 4.0
*/
public class InferiorRuntimeProcess extends RuntimeProcess {
public InferiorRuntimeProcess(ILaunch launch, Process process, String name,
Map<String, String> attributes) {
super(launch, process, name, attributes);
}
@Override
protected void terminated() {
// We must set the console label before calling super.terminated()
// This is because super.terminated() will send an event to rename
// the console, and we find ourselves in a race condition
// where we may miss setting the label here (bug 463977)
setConsoleTerminatedLabel();
super.terminated();
}
private void setConsoleTerminatedLabel() {
if (getAttribute(IGdbDebugConstants.INFERIOR_EXITED_ATTR) != null) {
// Add the exit code to the title of the console if the inferior properly exited.
int exitValue = 0;
try {
// We have to explicitly get the exit code from the lower level process
// instead of calling getExitValue() because we have not yet indicated
// that this wrapper process has terminated by calling super.terminated()
// Bug 463977
exitValue = getSystemProcess().exitValue();
} catch (IllegalThreadStateException e) {
// Process not terminated. Should not happen. Use default behavior.
return;
}
// Inspired from org.eclipse.debug.internal.ui.views.console.ProcessConsole#computeName
// We set the IProcess.ATTR_PROCESS_LABEL to modify the console title but not the process label
// of the debug view. Overriding getLabel() affects the element in the debug view also, so
// we don't do that.
String label = getLabel();
String type = null;
ILaunchConfiguration config = getLaunch().getLaunchConfiguration();
try {
type = config.getType().getName();
} catch (CoreException e) {
type = null;
}
StringBuilder buffer = new StringBuilder();
buffer.append(config.getName());
if (type != null) {
buffer.append(" ["); //$NON-NLS-1$
buffer.append(type);
buffer.append("] "); //$NON-NLS-1$
}
buffer.append(label);
// Prefix with exit value
buffer.insert(0, MessageFormat.format(LaunchMessages.getString("InferiorRuntimeProcess_ExitValue"), //$NON-NLS-1$
new Object[] { exitValue }));
label = buffer.toString();
setAttribute(IProcess.ATTR_PROCESS_LABEL, label);
}
}
}