mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-22 06:02:11 +02:00
Bug 361934 - Provide timeout for gdb commands
Change-Id: Id51a138411e49f7157858379f8aa09a59a8e4f78 Reviewed-on: https://git.eclipse.org/r/5523 Reviewed-by: Mikhail Khodjaiants <mikhailkhod@googlemail.com> IP-Clean: Mikhail Khodjaiants <mikhailkhod@googlemail.com> Tested-by: Mikhail Khodjaiants <mikhailkhod@googlemail.com>
This commit is contained in:
parent
77a06573a9
commit
74138d21f5
48 changed files with 1905 additions and 31 deletions
BIN
dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/icons/full/wizban/advtosettings_wiz.png
Executable file
BIN
dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/icons/full/wizban/advtosettings_wiz.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 8.3 KiB |
|
@ -475,4 +475,13 @@
|
||||||
</enablement>
|
</enablement>
|
||||||
</toggleTargetFactory>
|
</toggleTargetFactory>
|
||||||
</extension>
|
</extension>
|
||||||
|
<extension
|
||||||
|
point="org.eclipse.debug.core.statusHandlers">
|
||||||
|
<statusHandler
|
||||||
|
class="org.eclipse.cdt.dsf.gdb.internal.ui.GdbStatusHandler"
|
||||||
|
code="20001"
|
||||||
|
id="org.eclipse.cdt.dsf.gdb.ui.statusHandler"
|
||||||
|
plugin="org.eclipse.cdt.dsf.gdb">
|
||||||
|
</statusHandler>
|
||||||
|
</extension>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2011 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.dsf.gdb.internal.ui;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.debug.core.IStatusHandler;
|
||||||
|
import org.eclipse.jface.dialogs.MessageDialog;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
|
||||||
|
public class GdbStatusHandler implements IStatusHandler {
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.debug.core.IStatusHandler#handleStatus(org.eclipse.core.runtime.IStatus, java.lang.Object)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Object handleStatus( final IStatus status, Object source ) throws CoreException {
|
||||||
|
Runnable runnable = null;
|
||||||
|
if ( status.getSeverity() == IStatus.ERROR ) {
|
||||||
|
runnable = new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Shell parent = GdbUIPlugin.getActiveWorkbenchShell();
|
||||||
|
if ( parent != null )
|
||||||
|
MessageDialog.openError( parent, Messages.GdbStatusHandler_Error, status.getMessage() );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if ( status.getSeverity() == IStatus.WARNING ) {
|
||||||
|
runnable = new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Shell parent = GdbUIPlugin.getActiveWorkbenchShell();
|
||||||
|
if ( parent != null )
|
||||||
|
MessageDialog.openWarning( parent, Messages.GdbStatusHandler_Warning, status.getMessage() );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if ( status.getSeverity() == IStatus.INFO ) {
|
||||||
|
runnable = new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Shell parent = GdbUIPlugin.getActiveWorkbenchShell();
|
||||||
|
if ( parent != null )
|
||||||
|
MessageDialog.openInformation( parent, Messages.GdbStatusHandler_Information, status.getMessage() );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if ( runnable != null )
|
||||||
|
Display.getDefault().asyncExec( runnable );
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,6 +22,9 @@ import org.eclipse.debug.core.DebugPlugin;
|
||||||
import org.eclipse.debug.core.ILaunch;
|
import org.eclipse.debug.core.ILaunch;
|
||||||
import org.eclipse.jface.dialogs.ErrorDialog;
|
import org.eclipse.jface.dialogs.ErrorDialog;
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
|
import org.eclipse.jface.resource.ImageRegistry;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
import org.eclipse.swt.widgets.Shell;
|
import org.eclipse.swt.widgets.Shell;
|
||||||
import org.eclipse.ui.IWorkbenchPage;
|
import org.eclipse.ui.IWorkbenchPage;
|
||||||
import org.eclipse.ui.IWorkbenchWindow;
|
import org.eclipse.ui.IWorkbenchWindow;
|
||||||
|
@ -227,4 +230,32 @@ public class GdbUIPlugin extends AbstractUIPlugin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeImageRegistry(org.eclipse.jface.resource.ImageRegistry)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void initializeImageRegistry( ImageRegistry reg ) {
|
||||||
|
super.initializeImageRegistry( reg );
|
||||||
|
declareImages( reg );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an image descriptor for the image file at the given
|
||||||
|
* plug-in relative path
|
||||||
|
*
|
||||||
|
* @param path the path
|
||||||
|
* @return the image descriptor
|
||||||
|
*/
|
||||||
|
public static ImageDescriptor getImageDescriptor(String path) {
|
||||||
|
return imageDescriptorFromPlugin(PLUGIN_ID, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Image getImage( String key ) {
|
||||||
|
return getDefault().getImageRegistry().get( key );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void declareImages( ImageRegistry reg ) {
|
||||||
|
reg.put( IGdbUIConstants.IMG_WIZBAN_ADVANCED_TIMEOUT_SETTINGS,
|
||||||
|
getImageDescriptor( "icons/full/wizban/advtosettings_wiz.png" ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2011 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.dsf.gdb.internal.ui;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @noimplement This interface is not intended to be implemented by clients.
|
||||||
|
*
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public interface IGdbUIConstants {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plug-in identifier (value <code>"org.eclipse.cdt.dsf.gdb.ui"</code>).
|
||||||
|
*/
|
||||||
|
public static final String PLUGIN_ID = GdbUIPlugin.PLUGIN_ID;
|
||||||
|
|
||||||
|
/** image identifier. */
|
||||||
|
public static final String IMG_WIZBAN_ADVANCED_TIMEOUT_SETTINGS = PLUGIN_ID + ".imageAdvancedTimeoutSettings"; //$NON-NLS-1$
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2011 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.dsf.gdb.internal.ui;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
|
public class Messages extends NLS {
|
||||||
|
public static String GdbStatusHandler_Error;
|
||||||
|
|
||||||
|
public static String GdbStatusHandler_Information;
|
||||||
|
|
||||||
|
public static String GdbStatusHandler_Warning;
|
||||||
|
static {
|
||||||
|
// initialize resource bundle
|
||||||
|
NLS.initializeMessages( Messages.class.getName(), Messages.class );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Messages() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#######################################################################################
|
||||||
|
# Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
# Mentor Graphics - Initial API and implementation
|
||||||
|
#######################################################################################
|
||||||
|
|
||||||
|
GdbStatusHandler_Error=Error
|
||||||
|
GdbStatusHandler_Information=Information
|
||||||
|
GdbStatusHandler_Warning=Warning
|
|
@ -13,25 +13,62 @@
|
||||||
package org.eclipse.cdt.dsf.gdb.internal.ui.preferences;
|
package org.eclipse.cdt.dsf.gdb.internal.ui.preferences;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.debug.internal.ui.preferences.IntegerWithBooleanFieldEditor;
|
||||||
import org.eclipse.cdt.dsf.debug.internal.ui.preferences.StringWithBooleanFieldEditor;
|
import org.eclipse.cdt.dsf.debug.internal.ui.preferences.StringWithBooleanFieldEditor;
|
||||||
import org.eclipse.cdt.dsf.gdb.IGdbDebugPreferenceConstants;
|
import org.eclipse.cdt.dsf.gdb.IGdbDebugPreferenceConstants;
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
|
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.ui.launching.LaunchUIMessages;
|
import org.eclipse.cdt.dsf.gdb.internal.ui.IGdbUIConstants;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.service.command.CustomTimeoutsMap;
|
||||||
|
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||||
|
import org.eclipse.jface.dialogs.TitleAreaDialog;
|
||||||
|
import org.eclipse.jface.fieldassist.ControlDecoration;
|
||||||
|
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
|
||||||
import org.eclipse.jface.preference.BooleanFieldEditor;
|
import org.eclipse.jface.preference.BooleanFieldEditor;
|
||||||
import org.eclipse.jface.preference.FieldEditorPreferencePage;
|
import org.eclipse.jface.preference.FieldEditorPreferencePage;
|
||||||
import org.eclipse.jface.preference.IPreferenceStore;
|
import org.eclipse.jface.preference.IPreferenceStore;
|
||||||
import org.eclipse.jface.preference.IntegerFieldEditor;
|
import org.eclipse.jface.preference.IntegerFieldEditor;
|
||||||
import org.eclipse.jface.preference.StringFieldEditor;
|
import org.eclipse.jface.preference.StringFieldEditor;
|
||||||
|
import org.eclipse.jface.resource.JFaceResources;
|
||||||
|
import org.eclipse.jface.util.PropertyChangeEvent;
|
||||||
|
import org.eclipse.jface.viewers.CellEditor;
|
||||||
|
import org.eclipse.jface.viewers.ColumnLabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.ColumnViewer;
|
||||||
|
import org.eclipse.jface.viewers.DoubleClickEvent;
|
||||||
|
import org.eclipse.jface.viewers.EditingSupport;
|
||||||
|
import org.eclipse.jface.viewers.ICellEditorListener;
|
||||||
|
import org.eclipse.jface.viewers.ICellEditorValidator;
|
||||||
|
import org.eclipse.jface.viewers.IDoubleClickListener;
|
||||||
|
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredContentProvider;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.SelectionChangedEvent;
|
||||||
|
import org.eclipse.jface.viewers.StructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.TableViewer;
|
||||||
|
import org.eclipse.jface.viewers.TableViewerColumn;
|
||||||
|
import org.eclipse.jface.viewers.TextCellEditor;
|
||||||
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
import org.eclipse.jface.window.Window;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.ControlAdapter;
|
||||||
|
import org.eclipse.swt.events.ControlEvent;
|
||||||
import org.eclipse.swt.events.SelectionAdapter;
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
import org.eclipse.swt.events.SelectionEvent;
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.graphics.Rectangle;
|
||||||
import org.eclipse.swt.layout.GridData;
|
import org.eclipse.swt.layout.GridData;
|
||||||
import org.eclipse.swt.layout.GridLayout;
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
import org.eclipse.swt.widgets.Button;
|
import org.eclipse.swt.widgets.Button;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
import org.eclipse.swt.widgets.FileDialog;
|
import org.eclipse.swt.widgets.FileDialog;
|
||||||
import org.eclipse.swt.widgets.Group;
|
import org.eclipse.swt.widgets.Group;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.swt.widgets.Table;
|
||||||
|
import org.eclipse.swt.widgets.TableColumn;
|
||||||
import org.eclipse.ui.IWorkbench;
|
import org.eclipse.ui.IWorkbench;
|
||||||
import org.eclipse.ui.IWorkbenchPreferencePage;
|
import org.eclipse.ui.IWorkbenchPreferencePage;
|
||||||
import org.eclipse.ui.PlatformUI;
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
@ -41,6 +78,7 @@ import org.eclipse.ui.PlatformUI;
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("restriction")
|
@SuppressWarnings("restriction")
|
||||||
public class GdbDebugPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
|
public class GdbDebugPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A vehicle in order to be able to register a selection listener with
|
* A vehicle in order to be able to register a selection listener with
|
||||||
* a {@link BooleanFieldEditor}.
|
* a {@link BooleanFieldEditor}.
|
||||||
|
@ -58,20 +96,428 @@ public class GdbDebugPreferencePage extends FieldEditorPreferencePage implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class AdvancedTimeoutSettingsDialog extends TitleAreaDialog {
|
||||||
|
|
||||||
|
class CommandTimeoutEntry {
|
||||||
|
|
||||||
|
String fCommand;
|
||||||
|
Integer fTimeout;
|
||||||
|
|
||||||
|
CommandTimeoutEntry( String command, Integer timeout ) {
|
||||||
|
fCommand = command;
|
||||||
|
fTimeout = timeout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CellEditorListener implements ICellEditorListener {
|
||||||
|
|
||||||
|
CellEditor fEditor;
|
||||||
|
|
||||||
|
public CellEditorListener( CellEditor editor ) {
|
||||||
|
super();
|
||||||
|
fEditor = editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void editorValueChanged( boolean oldValidState, boolean newValidState ) {
|
||||||
|
if ( newValidState ) {
|
||||||
|
setErrorMessage( null );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setErrorMessage( fEditor.getErrorMessage() );
|
||||||
|
}
|
||||||
|
updateDialogButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cancelEditor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void applyEditorValue() {
|
||||||
|
validate();
|
||||||
|
updateDialogButtons();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
abstract class AbstractEditingSupport extends EditingSupport {
|
||||||
|
|
||||||
|
public AbstractEditingSupport( ColumnViewer viewer ) {
|
||||||
|
super( viewer );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setValue( Object element, Object value ) {
|
||||||
|
if ( element instanceof CommandTimeoutEntry && value instanceof String ) {
|
||||||
|
if ( processValue( (CommandTimeoutEntry)element, (String)value ) ) {
|
||||||
|
fViewer.refresh( element );
|
||||||
|
validate();
|
||||||
|
updateDialogButtons();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object getValue( Object element ) {
|
||||||
|
if ( element instanceof CommandTimeoutEntry ) {
|
||||||
|
return doGetValue( (CommandTimeoutEntry)element );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected CellEditor getCellEditor( Object element ) {
|
||||||
|
final CellEditor editor = new TextCellEditor( (Composite)getViewer().getControl() );
|
||||||
|
editor.setValidator( getValidator() );
|
||||||
|
editor.addListener( new CellEditorListener( editor ) );
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean canEdit( Object element ) {
|
||||||
|
return ( element instanceof CommandTimeoutEntry );
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract boolean processValue( CommandTimeoutEntry entry, String value );
|
||||||
|
|
||||||
|
abstract Object doGetValue( CommandTimeoutEntry entry );
|
||||||
|
|
||||||
|
abstract ICellEditorValidator getValidator();
|
||||||
|
};
|
||||||
|
|
||||||
|
private TableViewer fViewer;
|
||||||
|
private Button fAddButton;
|
||||||
|
private Button fDeleteButton;
|
||||||
|
|
||||||
|
private List<CommandTimeoutEntry> fEntries;
|
||||||
|
|
||||||
|
final private ICellEditorValidator fCommandValidator = new ICellEditorValidator() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String isValid( Object value ) {
|
||||||
|
if ( value instanceof String && ((String)value).trim().length() == 0 ) {
|
||||||
|
return MessagesForPreferences.GdbDebugPreferencePage_Command_field_can_not_be_empty;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
final private ICellEditorValidator fTimeoutValidator = new ICellEditorValidator() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String isValid( Object value ) {
|
||||||
|
if ( value instanceof String ) {
|
||||||
|
try {
|
||||||
|
int intValue = Integer.decode( (String)value ).intValue();
|
||||||
|
if ( intValue < 0 )
|
||||||
|
return MessagesForPreferences.GdbDebugPreferencePage_Timeout_value_can_not_be_negative;
|
||||||
|
}
|
||||||
|
catch( NumberFormatException e ) {
|
||||||
|
return MessagesForPreferences.GdbDebugPreferencePage_Invalid_timeout_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
AdvancedTimeoutSettingsDialog( Shell parentShell, Set<Map.Entry<String, Integer>> entries ) {
|
||||||
|
super( parentShell );
|
||||||
|
setShellStyle(getShellStyle() | SWT.RESIZE);
|
||||||
|
fEntries = new LinkedList<CommandTimeoutEntry>();
|
||||||
|
for ( Map.Entry<String, Integer> entry : entries ) {
|
||||||
|
fEntries.add( new CommandTimeoutEntry( entry.getKey(), entry.getValue() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Control createDialogArea( Composite parent ) {
|
||||||
|
getShell().setText( MessagesForPreferences.GdbDebugPreferencePage_Advanced_Timeout_Settings );
|
||||||
|
setTitle( MessagesForPreferences.GdbDebugPreferencePage_Advanced_timeout_dialog_title );
|
||||||
|
setTitleImage( GdbUIPlugin.getImage( IGdbUIConstants.IMG_WIZBAN_ADVANCED_TIMEOUT_SETTINGS ) );
|
||||||
|
setMessage( MessagesForPreferences.GdbDebugPreferencePage_Advanced_timeout_dialog_message );
|
||||||
|
|
||||||
|
Composite control = (Composite)super.createDialogArea( parent );
|
||||||
|
Composite comp = new Composite( control, SWT.NONE );
|
||||||
|
GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true );
|
||||||
|
GridLayout layout = new GridLayout( 2, false );
|
||||||
|
layout.marginLeft = FieldDecorationRegistry.getDefault().getMaximumDecorationWidth();
|
||||||
|
comp.setLayout( layout );
|
||||||
|
comp.setLayoutData( gd );
|
||||||
|
|
||||||
|
fViewer = new TableViewer( comp, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER );
|
||||||
|
final Table table = fViewer.getTable();
|
||||||
|
gd = new GridData( SWT.FILL, SWT.FILL, true, true );
|
||||||
|
gd.horizontalIndent = FieldDecorationRegistry.getDefault().getMaximumDecorationWidth();
|
||||||
|
table.setLayoutData( gd );
|
||||||
|
|
||||||
|
ControlDecoration decoration = new ControlDecoration( table, SWT.TOP | SWT.LEFT, control );
|
||||||
|
decoration.setImage(
|
||||||
|
FieldDecorationRegistry.getDefault().getFieldDecoration(
|
||||||
|
FieldDecorationRegistry.DEC_INFORMATION ).getImage() );
|
||||||
|
decoration.setDescriptionText(
|
||||||
|
MessagesForPreferences.GdbDebugPreferencePage_Advanced_timeout_settings_dialog_tooltip );
|
||||||
|
fViewer.addDoubleClickListener( new IDoubleClickListener() {
|
||||||
|
@Override
|
||||||
|
public void doubleClick( DoubleClickEvent event ) {
|
||||||
|
okPressed();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
fViewer.addSelectionChangedListener( new ISelectionChangedListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void selectionChanged( SelectionChangedEvent event ) {
|
||||||
|
updateDialogButtons();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
Composite btnComp = new Composite( comp, SWT.NONE );
|
||||||
|
btnComp.setLayout( new GridLayout() );
|
||||||
|
btnComp.setLayoutData( new GridData( SWT.RIGHT, SWT.TOP, false, false ) );
|
||||||
|
|
||||||
|
fAddButton = new Button( btnComp, SWT.PUSH );
|
||||||
|
fAddButton.setText( MessagesForPreferences.GdbDebugPreferencePage_Add_button );
|
||||||
|
fAddButton.setFont( JFaceResources.getDialogFont() );
|
||||||
|
setButtonLayoutData( fAddButton );
|
||||||
|
fAddButton.addSelectionListener( new SelectionAdapter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void widgetSelected( SelectionEvent e ) {
|
||||||
|
addNewEntry();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
fDeleteButton = new Button( btnComp, SWT.PUSH );
|
||||||
|
fDeleteButton.setText( MessagesForPreferences.GdbDebugPreferencePage_Delete_button );
|
||||||
|
fDeleteButton.setFont( JFaceResources.getDialogFont() );
|
||||||
|
setButtonLayoutData( fDeleteButton );
|
||||||
|
fDeleteButton.addSelectionListener( new SelectionAdapter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void widgetSelected( SelectionEvent e ) {
|
||||||
|
deleteEntries();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
table.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
|
||||||
|
table.setHeaderVisible( true );
|
||||||
|
table.setLinesVisible( true );
|
||||||
|
|
||||||
|
TableViewerColumn commandColumn = new TableViewerColumn( fViewer, SWT.LEFT );
|
||||||
|
commandColumn.getColumn().setText( MessagesForPreferences.GdbDebugPreferencePage_Command_column_name );
|
||||||
|
commandColumn.setLabelProvider( createCommandLabelProvider() );
|
||||||
|
commandColumn.setEditingSupport( createCommandEditingSupport( fViewer ) );
|
||||||
|
|
||||||
|
TableViewerColumn timeoutColumn = new TableViewerColumn( fViewer, SWT.LEFT );
|
||||||
|
timeoutColumn.getColumn().setText( MessagesForPreferences.GdbDebugPreferencePage_Timeout_column_name );
|
||||||
|
timeoutColumn.setLabelProvider( createTimeoutLabelProvider() );
|
||||||
|
timeoutColumn.setEditingSupport( createTimeoutEditingSupport( fViewer ) );
|
||||||
|
|
||||||
|
fViewer.setContentProvider( createCustomTimeoutsContentProvider() );
|
||||||
|
|
||||||
|
table.addControlListener( new ControlAdapter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void controlResized( ControlEvent e ) {
|
||||||
|
Rectangle area = table.getClientArea();
|
||||||
|
if ( area.width > 0 ) {
|
||||||
|
TableColumn[] cols = table.getColumns();
|
||||||
|
cols[0].setWidth( area.width * 50 / 100 );
|
||||||
|
cols[1].setWidth( area.width * 50 / 100 );
|
||||||
|
table.removeControlListener( this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
fViewer.setInput( fEntries );
|
||||||
|
|
||||||
|
updateDialogButtons();
|
||||||
|
|
||||||
|
return control;
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateDialogButtons() {
|
||||||
|
if ( fViewer != null && fDeleteButton != null ) {
|
||||||
|
fDeleteButton.setEnabled( !fViewer.getSelection().isEmpty() );
|
||||||
|
}
|
||||||
|
Button okButton = getButton( IDialogConstants.OK_ID );
|
||||||
|
if ( okButton != null )
|
||||||
|
okButton.setEnabled( getErrorMessage() == null );
|
||||||
|
}
|
||||||
|
|
||||||
|
void addNewEntry() {
|
||||||
|
CommandTimeoutEntry newEntry = new CommandTimeoutEntry( "", Integer.valueOf( 0 ) ); //$NON-NLS-1$
|
||||||
|
fEntries.add( newEntry );
|
||||||
|
fViewer.refresh();
|
||||||
|
fViewer.setSelection( new StructuredSelection( newEntry ) );
|
||||||
|
validateEntry( newEntry );
|
||||||
|
updateDialogButtons();
|
||||||
|
fViewer.editElement( newEntry, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteEntries() {
|
||||||
|
IStructuredSelection sel = (IStructuredSelection)fViewer.getSelection();
|
||||||
|
if ( !sel.isEmpty() )
|
||||||
|
fEntries.removeAll( sel.toList() );
|
||||||
|
fViewer.refresh();
|
||||||
|
validate();
|
||||||
|
updateDialogButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomTimeoutsMap getResult() {
|
||||||
|
CustomTimeoutsMap map = new CustomTimeoutsMap();
|
||||||
|
for ( CommandTimeoutEntry entry : fEntries ) {
|
||||||
|
map.put( entry.fCommand, entry.fTimeout );
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
void validate() {
|
||||||
|
for ( CommandTimeoutEntry entry : fEntries ) {
|
||||||
|
validateEntry( entry );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void validateEntry( CommandTimeoutEntry entry ) {
|
||||||
|
String errorMessage = fCommandValidator.isValid( entry.fCommand );
|
||||||
|
setErrorMessage( ( errorMessage != null ) ?
|
||||||
|
errorMessage : fTimeoutValidator.isValid( entry.fTimeout.toString() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
IStructuredContentProvider createCustomTimeoutsContentProvider() {
|
||||||
|
return new IStructuredContentProvider() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object[] getElements( Object inputElement ) {
|
||||||
|
if ( inputElement instanceof List<?> ) {
|
||||||
|
@SuppressWarnings( "unchecked" )
|
||||||
|
List<CommandTimeoutEntry> list = (List<CommandTimeoutEntry>)inputElement;
|
||||||
|
return list.toArray( new Object[list.size()] );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLabelProvider createCommandLabelProvider() {
|
||||||
|
return new ColumnLabelProvider() {
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getText( Object element ) {
|
||||||
|
if ( element instanceof CommandTimeoutEntry ) {
|
||||||
|
return ((CommandTimeoutEntry)element).fCommand;
|
||||||
|
}
|
||||||
|
return super.getText( element );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLabelProvider createTimeoutLabelProvider() {
|
||||||
|
return new ColumnLabelProvider() {
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getText( Object element ) {
|
||||||
|
if ( element instanceof CommandTimeoutEntry ) {
|
||||||
|
return ((CommandTimeoutEntry)element).fTimeout.toString();
|
||||||
|
}
|
||||||
|
return super.getText( element );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
EditingSupport createCommandEditingSupport( ColumnViewer viewer ) {
|
||||||
|
return new AbstractEditingSupport( viewer ) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean processValue( CommandTimeoutEntry entry, String value ) {
|
||||||
|
entry.fCommand = value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Object doGetValue( CommandTimeoutEntry entry ) {
|
||||||
|
return entry.fCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
ICellEditorValidator getValidator() {
|
||||||
|
return fCommandValidator;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
EditingSupport createTimeoutEditingSupport( ColumnViewer viewer ) {
|
||||||
|
return new AbstractEditingSupport( viewer ) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
boolean processValue( CommandTimeoutEntry entry, String value ) {
|
||||||
|
try {
|
||||||
|
entry.fTimeout = Integer.decode( value );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch( NumberFormatException e ) {
|
||||||
|
// Shouldn't happen, validator takes care of this case.
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Object doGetValue( CommandTimeoutEntry entry ) {
|
||||||
|
return entry.fTimeout.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
ICellEditorValidator getValidator() {
|
||||||
|
return fTimeoutValidator;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IntegerWithBooleanFieldEditor fCommandTimeoutField;
|
||||||
|
private Button fTimeoutAdvancedButton;
|
||||||
|
|
||||||
|
private CustomTimeoutsMap fCustomTimeouts;
|
||||||
|
|
||||||
public GdbDebugPreferencePage() {
|
public GdbDebugPreferencePage() {
|
||||||
super(FLAT);
|
super(FLAT);
|
||||||
IPreferenceStore store= GdbUIPlugin.getDefault().getPreferenceStore();
|
IPreferenceStore store= GdbUIPlugin.getDefault().getPreferenceStore();
|
||||||
setPreferenceStore(store);
|
setPreferenceStore(store);
|
||||||
setDescription(MessagesForPreferences.GdbDebugPreferencePage_description);
|
setDescription(MessagesForPreferences.GdbDebugPreferencePage_description);
|
||||||
|
fCustomTimeouts = new CustomTimeoutsMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(IWorkbench workbench) {
|
public void init(IWorkbench workbench) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void initialize() {
|
||||||
|
super.initialize();
|
||||||
|
initializeCustomTimeouts();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createControl(Composite parent) {
|
public void createControl(Composite parent) {
|
||||||
super.createControl(parent);
|
super.createControl(parent);
|
||||||
|
updateTimeoutButtons();
|
||||||
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
|
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
|
||||||
GdbUIPlugin.PLUGIN_ID + ".dsfgdb_preference_page"); //$NON-NLS-1$
|
GdbUIPlugin.PLUGIN_ID + ".dsfgdb_preference_page"); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
@ -91,44 +537,46 @@ public class GdbDebugPreferencePage extends FieldEditorPreferencePage implements
|
||||||
|
|
||||||
final StringFieldEditor stringFieldEditorCommand = new StringFieldEditor(
|
final StringFieldEditor stringFieldEditorCommand = new StringFieldEditor(
|
||||||
IGdbDebugPreferenceConstants.PREF_DEFAULT_GDB_COMMAND,
|
IGdbDebugPreferenceConstants.PREF_DEFAULT_GDB_COMMAND,
|
||||||
LaunchUIMessages.getString("GDBDebuggerPage.gdb_debugger"), //$NON-NLS-1$
|
"GDB debugger:", //$NON-NLS-1$
|
||||||
group1);
|
group1);
|
||||||
|
|
||||||
stringFieldEditorCommand.fillIntoGrid(group1, 2);
|
stringFieldEditorCommand.fillIntoGrid(group1, 2);
|
||||||
addField(stringFieldEditorCommand);
|
addField(stringFieldEditorCommand);
|
||||||
Button browsebutton = new Button(group1, SWT.PUSH);
|
Button browsebutton = new Button(group1, SWT.PUSH);
|
||||||
browsebutton.setText(LaunchUIMessages.getString("GDBDebuggerPage.gdb_browse")); //$NON-NLS-1$
|
browsebutton.setText("&Browse..."); //$NON-NLS-1$
|
||||||
browsebutton.addSelectionListener(new SelectionAdapter() {
|
browsebutton.addSelectionListener(new SelectionAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void widgetSelected(SelectionEvent e) {
|
public void widgetSelected(SelectionEvent e) {
|
||||||
handleBrowseButtonSelected(LaunchUIMessages.getString("GDBDebuggerPage.gdb_browse_dlg_title"), //$NON-NLS-1$
|
handleBrowseButtonSelected("GDB Debugger", //$NON-NLS-1$
|
||||||
stringFieldEditorCommand);
|
stringFieldEditorCommand);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
setButtonLayoutData( browsebutton );
|
||||||
|
|
||||||
final StringFieldEditor stringFieldEditorGdbInit = new StringFieldEditor(
|
final StringFieldEditor stringFieldEditorGdbInit = new StringFieldEditor(
|
||||||
IGdbDebugPreferenceConstants.PREF_DEFAULT_GDB_INIT,
|
IGdbDebugPreferenceConstants.PREF_DEFAULT_GDB_INIT,
|
||||||
LaunchUIMessages.getString("GDBDebuggerPage.gdb_command_file"), //$NON-NLS-1$
|
"GDB command file:", //$NON-NLS-1$
|
||||||
group1);
|
group1);
|
||||||
|
|
||||||
stringFieldEditorGdbInit.fillIntoGrid(group1, 2);
|
stringFieldEditorGdbInit.fillIntoGrid(group1, 2);
|
||||||
addField(stringFieldEditorGdbInit);
|
addField(stringFieldEditorGdbInit);
|
||||||
browsebutton = new Button(group1, SWT.PUSH);
|
browsebutton = new Button(group1, SWT.PUSH);
|
||||||
browsebutton.setText(LaunchUIMessages.getString("GDBDebuggerPage.gdb_browse")); //$NON-NLS-1$
|
browsebutton.setText("&Browse..."); //$NON-NLS-1$
|
||||||
browsebutton.addSelectionListener(new SelectionAdapter() {
|
browsebutton.addSelectionListener(new SelectionAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void widgetSelected(SelectionEvent e) {
|
public void widgetSelected(SelectionEvent e) {
|
||||||
handleBrowseButtonSelected(LaunchUIMessages.getString("GDBDebuggerPage.gdb_cmdfile_dlg_title"), //$NON-NLS-1$
|
handleBrowseButtonSelected("GDB Command File", //$NON-NLS-1$
|
||||||
stringFieldEditorGdbInit);
|
stringFieldEditorGdbInit);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
setButtonLayoutData( browsebutton );
|
||||||
|
|
||||||
final StringWithBooleanFieldEditor enableStopAtMain = new StringWithBooleanFieldEditor(
|
final StringWithBooleanFieldEditor enableStopAtMain = new StringWithBooleanFieldEditor(
|
||||||
IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN,
|
IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN,
|
||||||
IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN_SYMBOL,
|
IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN_SYMBOL,
|
||||||
LaunchUIMessages.getString("CDebuggerTab.Stop_at_main_on_startup"), //$NON-NLS-1$
|
"Stop on startup at:", //$NON-NLS-1$
|
||||||
group1);
|
group1);
|
||||||
enableStopAtMain.fillIntoGrid(group1, 2);
|
enableStopAtMain.fillIntoGrid(group1, 3);
|
||||||
addField(enableStopAtMain);
|
addField(enableStopAtMain);
|
||||||
|
|
||||||
// final StringFieldEditor stopAtMainSymbol = new StringFieldEditor(
|
// final StringFieldEditor stopAtMainSymbol = new StringFieldEditor(
|
||||||
|
@ -145,9 +593,29 @@ public class GdbDebugPreferencePage extends FieldEditorPreferencePage implements
|
||||||
// }
|
// }
|
||||||
// });
|
// });
|
||||||
|
|
||||||
|
fCommandTimeoutField = new IntegerWithBooleanFieldEditor(
|
||||||
|
IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT,
|
||||||
|
IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT_VALUE,
|
||||||
|
MessagesForPreferences.GdbDebugPreferencePage_Command_timeout,
|
||||||
|
group1);
|
||||||
|
fCommandTimeoutField.setValidRange(0, Integer.MAX_VALUE);
|
||||||
|
fCommandTimeoutField.fillIntoGrid(group1, 2);
|
||||||
|
addField(fCommandTimeoutField);
|
||||||
|
|
||||||
|
fTimeoutAdvancedButton = new Button(group1, SWT.PUSH);
|
||||||
|
fTimeoutAdvancedButton.setText(MessagesForPreferences.GdbDebugPreferencePage_Advanced_button);
|
||||||
|
fTimeoutAdvancedButton.addSelectionListener(new SelectionAdapter() {
|
||||||
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
handleAdvancedButtonSelected(
|
||||||
|
"GDB Debugger"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
});
|
||||||
|
setButtonLayoutData( fTimeoutAdvancedButton );
|
||||||
|
|
||||||
final ListenableBooleanFieldEditor enableNonStop= new ListenableBooleanFieldEditor(
|
final ListenableBooleanFieldEditor enableNonStop= new ListenableBooleanFieldEditor(
|
||||||
IGdbDebugPreferenceConstants.PREF_DEFAULT_NON_STOP,
|
IGdbDebugPreferenceConstants.PREF_DEFAULT_NON_STOP,
|
||||||
LaunchUIMessages.getString("GDBDebuggerPage.nonstop_mode"), //$NON-NLS-1$
|
"Non-stop mode (Note: Requires non-stop GDB)", //$NON-NLS-1$
|
||||||
SWT.NONE, group1);
|
SWT.NONE, group1);
|
||||||
enableNonStop.fillIntoGrid(group1, 3);
|
enableNonStop.fillIntoGrid(group1, 3);
|
||||||
addField(enableNonStop);
|
addField(enableNonStop);
|
||||||
|
@ -286,8 +754,56 @@ public class GdbDebugPreferencePage extends FieldEditorPreferencePage implements
|
||||||
stringFieldEditor.setStringValue(res);
|
stringFieldEditor.setStringValue(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void handleAdvancedButtonSelected(String dialogTitle) {
|
||||||
|
AdvancedTimeoutSettingsDialog dialog =
|
||||||
|
new AdvancedTimeoutSettingsDialog( getShell(), fCustomTimeouts.entrySet() );
|
||||||
|
if ( dialog.open() == Window.OK ) {
|
||||||
|
fCustomTimeouts = dialog.getResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void adjustGridLayout() {
|
protected void adjustGridLayout() {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void propertyChange( PropertyChangeEvent event ) {
|
||||||
|
if ( event.getSource().equals( fCommandTimeoutField ) && event.getNewValue() instanceof Boolean ) {
|
||||||
|
fTimeoutAdvancedButton.setEnabled( ((Boolean)event.getNewValue()).booleanValue() );
|
||||||
|
}
|
||||||
|
super.propertyChange( event );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void performDefaults() {
|
||||||
|
IPreferenceStore store = getPreferenceStore();
|
||||||
|
if ( store != null ) {
|
||||||
|
String memento = store.getDefaultString( IGdbDebugPreferenceConstants.PREF_COMMAND_CUSTOM_TIMEOUTS );
|
||||||
|
fCustomTimeouts.initializeFromMemento( memento );
|
||||||
|
}
|
||||||
|
super.performDefaults();
|
||||||
|
updateTimeoutButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.jface.preference.FieldEditorPreferencePage#performOk()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean performOk() {
|
||||||
|
getPreferenceStore().setValue( IGdbDebugPreferenceConstants.PREF_COMMAND_CUSTOM_TIMEOUTS, fCustomTimeouts.getMemento() );
|
||||||
|
return super.performOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateTimeoutButtons() {
|
||||||
|
fTimeoutAdvancedButton.setEnabled( fCommandTimeoutField.getBooleanValue() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializeCustomTimeouts() {
|
||||||
|
IPreferenceStore store = getPreferenceStore();
|
||||||
|
if ( store != null ) {
|
||||||
|
String memento = store.getString( IGdbDebugPreferenceConstants.PREF_COMMAND_CUSTOM_TIMEOUTS );
|
||||||
|
fCustomTimeouts.initializeFromMemento( memento );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,12 @@ import org.eclipse.osgi.util.NLS;
|
||||||
* Preference strings.
|
* Preference strings.
|
||||||
*/
|
*/
|
||||||
class MessagesForPreferences extends NLS {
|
class MessagesForPreferences extends NLS {
|
||||||
|
public static String GdbDebugPreferencePage_Add_button;
|
||||||
|
public static String GdbDebugPreferencePage_Advanced_button;
|
||||||
|
public static String GdbDebugPreferencePage_Advanced_timeout_dialog_message;
|
||||||
|
public static String GdbDebugPreferencePage_Advanced_timeout_dialog_title;
|
||||||
|
public static String GdbDebugPreferencePage_Advanced_timeout_settings_dialog_tooltip;
|
||||||
|
public static String GdbDebugPreferencePage_Advanced_Timeout_Settings;
|
||||||
public static String GdbDebugPreferencePage_description;
|
public static String GdbDebugPreferencePage_description;
|
||||||
public static String GdbDebugPreferencePage_traces_label;
|
public static String GdbDebugPreferencePage_traces_label;
|
||||||
public static String GdbDebugPreferencePage_enableTraces_label;
|
public static String GdbDebugPreferencePage_enableTraces_label;
|
||||||
|
@ -24,6 +30,9 @@ class MessagesForPreferences extends NLS {
|
||||||
public static String GdbDebugPreferencePage_maxGdbTraces_label;
|
public static String GdbDebugPreferencePage_maxGdbTraces_label;
|
||||||
public static String GdbDebugPreferencePage_termination_label;
|
public static String GdbDebugPreferencePage_termination_label;
|
||||||
public static String GdbDebugPreferencePage_autoTerminateGdb_label;
|
public static String GdbDebugPreferencePage_autoTerminateGdb_label;
|
||||||
|
public static String GdbDebugPreferencePage_Command_column_name;
|
||||||
|
public static String GdbDebugPreferencePage_Command_field_can_not_be_empty;
|
||||||
|
public static String GdbDebugPreferencePage_Command_timeout;
|
||||||
public static String GdbDebugPreferencePage_hover_label;
|
public static String GdbDebugPreferencePage_hover_label;
|
||||||
public static String GdbDebugPreferencePage_useInspectorHover_label;
|
public static String GdbDebugPreferencePage_useInspectorHover_label;
|
||||||
/** @since 2.2 */
|
/** @since 2.2 */
|
||||||
|
@ -36,6 +45,10 @@ class MessagesForPreferences extends NLS {
|
||||||
public static String GdbDebugPreferencePage_initialChildCountLimitForCollections_label;
|
public static String GdbDebugPreferencePage_initialChildCountLimitForCollections_label;
|
||||||
/** @since 2.2 */
|
/** @since 2.2 */
|
||||||
public static String GdbDebugPreferencePage_defaults_label;
|
public static String GdbDebugPreferencePage_defaults_label;
|
||||||
|
public static String GdbDebugPreferencePage_Delete_button;
|
||||||
|
public static String GdbDebugPreferencePage_Invalid_timeout_value;
|
||||||
|
public static String GdbDebugPreferencePage_Timeout_column_name;
|
||||||
|
public static String GdbDebugPreferencePage_Timeout_value_can_not_be_negative;
|
||||||
static {
|
static {
|
||||||
// initialize resource bundle
|
// initialize resource bundle
|
||||||
NLS.initializeMessages(MessagesForPreferences.class.getName(), MessagesForPreferences.class);
|
NLS.initializeMessages(MessagesForPreferences.class.getName(), MessagesForPreferences.class);
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
# Jens Elmenthaler (Verigy) - Added Full GDB pretty-printing support (bug 302121)
|
# Jens Elmenthaler (Verigy) - Added Full GDB pretty-printing support (bug 302121)
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
GdbDebugPreferencePage_Add_button=Add
|
||||||
GdbDebugPreferencePage_description=General settings for GDB Debugging
|
GdbDebugPreferencePage_description=General settings for GDB Debugging
|
||||||
|
|
||||||
GdbDebugPreferencePage_traces_label=Traces
|
GdbDebugPreferencePage_traces_label=Traces
|
||||||
|
@ -17,6 +18,9 @@ GdbDebugPreferencePage_enableTraces_label=Enable GDB traces
|
||||||
GdbDebugPreferencePage_maxGdbTraces_label=Limit GDB traces output (number of characters):
|
GdbDebugPreferencePage_maxGdbTraces_label=Limit GDB traces output (number of characters):
|
||||||
GdbDebugPreferencePage_termination_label=Termination
|
GdbDebugPreferencePage_termination_label=Termination
|
||||||
GdbDebugPreferencePage_autoTerminateGdb_label=Terminate GDB when last process exits
|
GdbDebugPreferencePage_autoTerminateGdb_label=Terminate GDB when last process exits
|
||||||
|
GdbDebugPreferencePage_Command_column_name=GDB/MI Command
|
||||||
|
GdbDebugPreferencePage_Command_field_can_not_be_empty='Command' field can not be empty
|
||||||
|
GdbDebugPreferencePage_Command_timeout=Command timeout (ms):
|
||||||
|
|
||||||
GdbDebugPreferencePage_hover_label=Debug Text Hover
|
GdbDebugPreferencePage_hover_label=Debug Text Hover
|
||||||
GdbDebugPreferencePage_useInspectorHover_label=Use enhanced debug hover
|
GdbDebugPreferencePage_useInspectorHover_label=Use enhanced debug hover
|
||||||
|
@ -27,3 +31,13 @@ GdbDebugPreferencePage_enablePrettyPrinting_label2=(requires python-enabled GDB)
|
||||||
GdbDebugPreferencePage_initialChildCountLimitForCollections_label=For collections, initially limit child count to
|
GdbDebugPreferencePage_initialChildCountLimitForCollections_label=For collections, initially limit child count to
|
||||||
|
|
||||||
GdbDebugPreferencePage_defaults_label=Debug Configurations Defaults
|
GdbDebugPreferencePage_defaults_label=Debug Configurations Defaults
|
||||||
|
GdbDebugPreferencePage_Delete_button=Delete
|
||||||
|
GdbDebugPreferencePage_Invalid_timeout_value=Invalid timeout value
|
||||||
|
GdbDebugPreferencePage_Timeout_column_name=Timeout(ms)
|
||||||
|
GdbDebugPreferencePage_Timeout_value_can_not_be_negative=Timeout value can not be negative
|
||||||
|
|
||||||
|
GdbDebugPreferencePage_Advanced_button=&Advanced...
|
||||||
|
GdbDebugPreferencePage_Advanced_timeout_dialog_message=Specify commands and corresponding timeout values.
|
||||||
|
GdbDebugPreferencePage_Advanced_timeout_dialog_title=Add/delete/modify custom timeouts for GDB/MI commands
|
||||||
|
GdbDebugPreferencePage_Advanced_timeout_settings_dialog_tooltip=Specify commands and corresponding timeout values, use zero for "no timeout".\nMI commands must start with hyphen ('-'). For example, '-target-select'.\nThe default value will be used for all commands that are not mentioned here.
|
||||||
|
GdbDebugPreferencePage_Advanced_Timeout_Settings=Advanced Timeout Settings
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
org.eclipse.cdt.dsf.gdb/debug = false
|
org.eclipse.cdt.dsf.gdb/debug = false
|
||||||
|
org.eclipse.cdt.dsf.gdb/debug/timeouts = false
|
||||||
|
|
|
@ -16,7 +16,6 @@ import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||||
import org.eclipse.cdt.dsf.mi.service.IMIContainerDMContext;
|
import org.eclipse.cdt.dsf.mi.service.IMIContainerDMContext;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @noimplement This interface is not intended to be implemented by clients.
|
* @noimplement This interface is not intended to be implemented by clients.
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
|
@ -25,6 +24,12 @@ public interface IGdbDebugConstants {
|
||||||
|
|
||||||
public static final String PREFIX = GdbPlugin.PLUGIN_ID + "."; //$NON-NLS-1$
|
public static final String PREFIX = GdbPlugin.PLUGIN_ID + "."; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Status code for which a UI handler is registered.
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public static final int STATUS_HANDLER_CODE = 20001;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attribute key to be added to the IProcess associated with an IMIContainerDMContext.
|
* Attribute key to be added to the IProcess associated with an IMIContainerDMContext.
|
||||||
* The value should be the groupId as returned by {@link IMIContainerDMContext#getGroupId()}
|
* The value should be the groupId as returned by {@link IMIContainerDMContext#getGroupId()}
|
||||||
|
@ -54,6 +59,5 @@ public interface IGdbDebugConstants {
|
||||||
*/
|
*/
|
||||||
public static final String GDB_PROCESS_CREATION_VALUE = PREFIX + "gdbProcess"; //$NON-NLS-1$
|
public static final String GDB_PROCESS_CREATION_VALUE = PREFIX + "gdbProcess"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,11 @@ import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||||
public interface IGdbDebugPreferenceConstants {
|
public interface IGdbDebugPreferenceConstants {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Help prefixes.
|
||||||
|
*/
|
||||||
|
public static final String PREFIX = GdbPlugin.PLUGIN_ID + "."; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
* Boolean preference whether to enable GDB traces. Default is <code>true</code>.
|
* Boolean preference whether to enable GDB traces. Default is <code>true</code>.
|
||||||
*/
|
*/
|
||||||
public static final String PREF_TRACES_ENABLE = "tracesEnable"; //$NON-NLS-1$
|
public static final String PREF_TRACES_ENABLE = "tracesEnable"; //$NON-NLS-1$
|
||||||
|
@ -87,8 +92,27 @@ public interface IGdbDebugPreferenceConstants {
|
||||||
public static final String PREF_DEFAULT_NON_STOP = "defaultNonStop"; //$NON-NLS-1$
|
public static final String PREF_DEFAULT_NON_STOP = "defaultNonStop"; //$NON-NLS-1$
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Help prefixes.
|
* The value is an boolean specifying whether the timeout is used for GDB commands.
|
||||||
*/
|
* @since 4.1
|
||||||
public static final String PREFIX = GdbPlugin.PLUGIN_ID + "."; //$NON-NLS-1$
|
*/
|
||||||
|
public static final String PREF_COMMAND_TIMEOUT = PREFIX + "commandTimeout"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value is an integer specifying the timeout value (milliseconds) for GDB commands.
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public static final String PREF_COMMAND_TIMEOUT_VALUE = PREFIX + "commandTimeoutValue"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The value is a string specifying the list of GDB/MI commands with custom timeout values.
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public static final String PREF_COMMAND_CUSTOM_TIMEOUTS = PREFIX + "commandCustomTimeouts"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default default value for <code>PREF_COMMAND_TIMEOUT</code>;
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public static final int COMMAND_TIMEOUT_VALUE_DEFAULT = 10000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,5 +38,7 @@ public class GdbPreferenceInitializer extends AbstractPreferenceInitializer {
|
||||||
node.putBoolean(IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_DEFAULT);
|
node.putBoolean(IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_DEFAULT);
|
||||||
node.put(IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN_SYMBOL, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT);
|
node.put(IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN_SYMBOL, ICDTLaunchConfigurationConstants.DEBUGGER_STOP_AT_MAIN_SYMBOL_DEFAULT);
|
||||||
node.putBoolean(IGdbDebugPreferenceConstants.PREF_DEFAULT_NON_STOP, IGDBLaunchConfigurationConstants.DEBUGGER_NON_STOP_DEFAULT);
|
node.putBoolean(IGdbDebugPreferenceConstants.PREF_DEFAULT_NON_STOP, IGDBLaunchConfigurationConstants.DEBUGGER_NON_STOP_DEFAULT);
|
||||||
|
node.putBoolean(IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT, false);
|
||||||
|
node.putInt(IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT_VALUE, IGdbDebugPreferenceConstants.COMMAND_TIMEOUT_VALUE_DEFAULT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2011 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.dsf.gdb.internal;
|
||||||
|
|
||||||
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
|
public class Messages extends NLS {
|
||||||
|
|
||||||
|
public static String CustomTimeoutsMap_Error_initializing_custom_timeouts;
|
||||||
|
|
||||||
|
public static String CustomTimeoutsMap_Invalid_custom_timeout_data;
|
||||||
|
|
||||||
|
public static String CustomTimeoutsMap_Invalid_custom_timeout_value;
|
||||||
|
|
||||||
|
public static String GDBControl_Session_is_terminated;
|
||||||
|
static {
|
||||||
|
// initialize resource bundle
|
||||||
|
NLS.initializeMessages( Messages.class.getName(), Messages.class );
|
||||||
|
}
|
||||||
|
|
||||||
|
private Messages() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
#######################################################################################
|
||||||
|
# Copyright (c) 2011 Mentor Graphics 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:
|
||||||
|
# Mentor Graphics - Initial API and implementation
|
||||||
|
#######################################################################################
|
||||||
|
|
||||||
|
CustomTimeoutsMap_Error_initializing_custom_timeouts=Error initializing custom timeouts
|
||||||
|
CustomTimeoutsMap_Invalid_custom_timeout_data=Invalid custom timeout data.
|
||||||
|
CustomTimeoutsMap_Invalid_custom_timeout_value=Invalid custom timeout value for '%s'.
|
||||||
|
GDBControl_Session_is_terminated=Session is terminated.\nReason: %s
|
|
@ -0,0 +1,79 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2011 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.dsf.gdb.service.command;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.internal.Messages;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.MultiStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public class CustomTimeoutsMap extends HashMap<String, Integer> {
|
||||||
|
|
||||||
|
public CustomTimeoutsMap() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomTimeoutsMap( CustomTimeoutsMap map ) {
|
||||||
|
super( map );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -8281280275781904870L;
|
||||||
|
|
||||||
|
public String getMemento() {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for ( Map.Entry<String, Integer> entry : entrySet() ) {
|
||||||
|
sb.append( entry.getKey() );
|
||||||
|
sb.append( ',' );
|
||||||
|
sb.append( entry.getValue().intValue() );
|
||||||
|
sb.append( ';' );
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeFromMemento( String memento ) {
|
||||||
|
clear();
|
||||||
|
StringTokenizer st = new StringTokenizer( memento, ";" ); //$NON-NLS-1$
|
||||||
|
MultiStatus ms = new MultiStatus( GdbPlugin.PLUGIN_ID, 0, Messages.CustomTimeoutsMap_Error_initializing_custom_timeouts, null );
|
||||||
|
while( st.hasMoreTokens() ) {
|
||||||
|
String token = st.nextToken();
|
||||||
|
String[] tokenParts = token.split( "," ); //$NON-NLS-1$
|
||||||
|
if ( tokenParts.length == 2 && tokenParts[0].length() > 0 && tokenParts[1].length() > 0 ) {
|
||||||
|
try {
|
||||||
|
put( tokenParts[0], Integer.valueOf( tokenParts[1] ) );
|
||||||
|
}
|
||||||
|
catch( NumberFormatException e ) {
|
||||||
|
ms.add( new Status(
|
||||||
|
IStatus.ERROR,
|
||||||
|
GdbPlugin.PLUGIN_ID,
|
||||||
|
String.format( Messages.CustomTimeoutsMap_Invalid_custom_timeout_value, tokenParts[0] ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ms.add( new Status(
|
||||||
|
IStatus.ERROR,
|
||||||
|
GdbPlugin.PLUGIN_ID,
|
||||||
|
Messages.CustomTimeoutsMap_Invalid_custom_timeout_data ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( !ms.isOK() ) {
|
||||||
|
GdbPlugin.getDefault().getLog().log( ms );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,6 +30,7 @@ import java.util.Properties;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
|
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
|
||||||
|
@ -43,10 +44,14 @@ import org.eclipse.cdt.dsf.datamodel.AbstractDMEvent;
|
||||||
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
|
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
|
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
|
||||||
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
|
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.command.ICommandToken;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.IGdbDebugConstants;
|
||||||
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.internal.Messages;
|
||||||
import org.eclipse.cdt.dsf.gdb.launching.FinalLaunchSequence;
|
import org.eclipse.cdt.dsf.gdb.launching.FinalLaunchSequence;
|
||||||
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
|
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
|
||||||
import org.eclipse.cdt.dsf.gdb.service.IGDBProcesses;
|
import org.eclipse.cdt.dsf.gdb.service.IGDBProcesses;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.service.command.GdbCommandTimeoutManager.ICommandTimeoutListener;
|
||||||
import org.eclipse.cdt.dsf.mi.service.IMIBackend;
|
import org.eclipse.cdt.dsf.mi.service.IMIBackend;
|
||||||
import org.eclipse.cdt.dsf.mi.service.IMIBackend.BackendStateChangedEvent;
|
import org.eclipse.cdt.dsf.mi.service.IMIBackend.BackendStateChangedEvent;
|
||||||
import org.eclipse.cdt.dsf.mi.service.IMIBackend2;
|
import org.eclipse.cdt.dsf.mi.service.IMIBackend2;
|
||||||
|
@ -69,8 +74,10 @@ import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
import org.eclipse.debug.core.ILaunch;
|
import org.eclipse.debug.core.ILaunch;
|
||||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
|
import org.eclipse.debug.core.IStatusHandler;
|
||||||
import org.osgi.framework.BundleContext;
|
import org.osgi.framework.BundleContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -82,6 +89,8 @@ import org.osgi.framework.BundleContext;
|
||||||
*/
|
*/
|
||||||
public class GDBControl extends AbstractMIControl implements IGDBControl {
|
public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
|
|
||||||
|
private static final int STATUS_CODE_COMMAND_TIMED_OUT = 20100;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event indicating that the back end process has started.
|
* Event indicating that the back end process has started.
|
||||||
*/
|
*/
|
||||||
|
@ -104,6 +113,20 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class TimeoutListener implements ICommandTimeoutListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void commandTimedOut(final ICommandToken token) {
|
||||||
|
getExecutor().execute(new DsfRunnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
GDBControl.this.commandTimedOut(token);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private GDBControlDMContext fControlDmc;
|
private GDBControlDMContext fControlDmc;
|
||||||
|
|
||||||
private IGDBBackend fMIBackend;
|
private IGDBBackend fMIBackend;
|
||||||
|
@ -112,6 +135,10 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
private IEventProcessor fCLICommandProcessor;
|
private IEventProcessor fCLICommandProcessor;
|
||||||
private AbstractCLIProcess fCLIProcess;
|
private AbstractCLIProcess fCLIProcess;
|
||||||
|
|
||||||
|
private GdbCommandTimeoutManager fCommandTimeoutManager;
|
||||||
|
|
||||||
|
private ICommandTimeoutListener fTimeoutListener = new TimeoutListener();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GDBControl is only used for GDB earlier that 7.0. Although -list-features
|
* GDBControl is only used for GDB earlier that 7.0. Although -list-features
|
||||||
* is available in 6.8, it does not report anything we care about, so
|
* is available in 6.8, it does not report anything we care about, so
|
||||||
|
@ -121,6 +148,14 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
|
|
||||||
private Sequence fInitializationSequence;
|
private Sequence fInitializationSequence;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicator to distinguish whether this service is initialized.
|
||||||
|
* <code>fInitializationSequence</code> can not be used for this
|
||||||
|
* purpose because there is a period of time when the service is already
|
||||||
|
* initializing but the initialization sequence has not created yet.
|
||||||
|
*/
|
||||||
|
private boolean fInitialized = false;
|
||||||
|
|
||||||
private boolean fTerminated;
|
private boolean fTerminated;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -308,6 +343,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
@Override
|
@Override
|
||||||
protected void handleCompleted() {
|
protected void handleCompleted() {
|
||||||
fInitializationSequence = null;
|
fInitializationSequence = null;
|
||||||
|
fInitialized = true;
|
||||||
if (!isCanceled()) {
|
if (!isCanceled()) {
|
||||||
// Only set the status if the user has not cancelled the operation already.
|
// Only set the status if the user has not cancelled the operation already.
|
||||||
rm.setStatus(getStatus());
|
rm.setStatus(getStatus());
|
||||||
|
@ -440,6 +476,33 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
protected class CommandTimeoutStep extends InitializationShutdownStep {
|
||||||
|
CommandTimeoutStep( Direction direction ) {
|
||||||
|
super( direction );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize( final RequestMonitor requestMonitor ) {
|
||||||
|
fCommandTimeoutManager = createCommandTimeoutManager( GDBControl.this );
|
||||||
|
if (fCommandTimeoutManager != null) {
|
||||||
|
fCommandTimeoutManager.addCommandTimeoutListener(fTimeoutListener);
|
||||||
|
}
|
||||||
|
requestMonitor.done();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void shutdown( RequestMonitor requestMonitor ) {
|
||||||
|
if ( fCommandTimeoutManager != null ) {
|
||||||
|
fCommandTimeoutManager.removeCommandTimeoutListener(fTimeoutListener);
|
||||||
|
fCommandTimeoutManager.dispose();
|
||||||
|
}
|
||||||
|
requestMonitor.done();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected class RegisterStep extends InitializationShutdownStep {
|
protected class RegisterStep extends InitializationShutdownStep {
|
||||||
RegisterStep(Direction direction) { super(direction); }
|
RegisterStep(Direction direction) { super(direction); }
|
||||||
@Override
|
@Override
|
||||||
|
@ -493,6 +556,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
||||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.INITIALIZING),
|
new CommandMonitoringStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.INITIALIZING),
|
new CommandProcessorsStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
|
new CommandTimeoutStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
new RegisterStep(InitializationShutdownStep.Direction.INITIALIZING),
|
new RegisterStep(InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -507,6 +571,7 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
protected Sequence getShutdownSequence(RequestMonitor requestMonitor) {
|
protected Sequence getShutdownSequence(RequestMonitor requestMonitor) {
|
||||||
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
||||||
new RegisterStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new RegisterStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
|
new CommandTimeoutStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
new CommandProcessorsStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new CommandProcessorsStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
new CommandMonitoringStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new CommandMonitoringStep(InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
};
|
};
|
||||||
|
@ -536,4 +601,63 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
|
||||||
fFeatures.clear();
|
fFeatures.clear();
|
||||||
fFeatures.addAll(features);
|
fFeatures.addAll(features);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
protected GdbCommandTimeoutManager createCommandTimeoutManager(ICommandControl commandControl) {
|
||||||
|
GdbCommandTimeoutManager manager = new GdbCommandTimeoutManager(commandControl);
|
||||||
|
manager.initialize();
|
||||||
|
return manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
@ConfinedToDsfExecutor("this.getExecutor()")
|
||||||
|
protected void commandTimedOut(ICommandToken token) {
|
||||||
|
String commandText = token.getCommand().toString();
|
||||||
|
if (commandText.endsWith("\n")) //$NON-NLS-1$
|
||||||
|
commandText = commandText.substring(0, commandText.length() - 1);
|
||||||
|
final String errorMessage = String.format("Command '%s' is timed out", commandText); //$NON-NLS-1$
|
||||||
|
commandFailed(token, STATUS_CODE_COMMAND_TIMED_OUT, errorMessage);
|
||||||
|
|
||||||
|
// If the timeout occurs while the launch sequence is running
|
||||||
|
// the error will be reported by the launcher's error reporting mechanism.
|
||||||
|
// We need to show the error message only when the session is initialized.
|
||||||
|
if (isInitialized()) {
|
||||||
|
// The session is terminated if a command is timed out.
|
||||||
|
terminate(new RequestMonitor(getExecutor(), null) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void handleErrorOrWarning() {
|
||||||
|
GdbPlugin.getDefault().getLog().log(getStatus());
|
||||||
|
super.handleErrorOrWarning();
|
||||||
|
};
|
||||||
|
} );
|
||||||
|
|
||||||
|
IStatus status = new Status(
|
||||||
|
IStatus.ERROR,
|
||||||
|
GdbPlugin.PLUGIN_ID,
|
||||||
|
IGdbDebugConstants.STATUS_HANDLER_CODE,
|
||||||
|
String.format( Messages.GDBControl_Session_is_terminated, errorMessage ),
|
||||||
|
null);
|
||||||
|
IStatusHandler statusHandler = DebugPlugin.getDefault().getStatusHandler(status);
|
||||||
|
if (statusHandler != null) {
|
||||||
|
try {
|
||||||
|
statusHandler.handleStatus(status, null);
|
||||||
|
}
|
||||||
|
catch(CoreException e) {
|
||||||
|
GdbPlugin.getDefault().getLog().log(e.getStatus());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
protected boolean isInitialized() {
|
||||||
|
return fInitialized;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,6 +147,7 @@ public class GDBControl_7_0 extends GDBControl {
|
||||||
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
final Sequence.Step[] initializeSteps = new Sequence.Step[] {
|
||||||
new GDBControl.CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
new GDBControl.CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
new GDBControl.CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
new GDBControl.CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
|
new CommandTimeoutStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
new GDBControl.RegisterStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
new GDBControl.RegisterStep(GDBControl.InitializationShutdownStep.Direction.INITIALIZING),
|
||||||
};
|
};
|
||||||
|
@ -161,6 +162,7 @@ public class GDBControl_7_0 extends GDBControl {
|
||||||
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
final Sequence.Step[] shutdownSteps = new Sequence.Step[] {
|
||||||
new GDBControl.RegisterStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new GDBControl.RegisterStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new ListFeaturesStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
|
new CommandTimeoutStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
new GDBControl.CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new GDBControl.CommandProcessorsStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
new GDBControl.CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
new GDBControl.CommandMonitoringStep(GDBControl.InitializationShutdownStep.Direction.SHUTTING_DOWN),
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,443 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2011 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.dsf.gdb.service.command;
|
||||||
|
|
||||||
|
import java.util.concurrent.BlockingQueue;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.command.ICommandControl;
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.command.ICommandListener;
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.command.ICommandResult;
|
||||||
|
import org.eclipse.cdt.dsf.debug.service.command.ICommandToken;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.IGdbDebugPreferenceConstants;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||||
|
import org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl;
|
||||||
|
import org.eclipse.cdt.dsf.mi.service.command.commands.MICommand;
|
||||||
|
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.ListenerList;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
|
||||||
|
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
|
||||||
|
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
|
||||||
|
import org.eclipse.core.runtime.preferences.InstanceScope;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The command timeout manager registers itself as a command listener and monitors
|
||||||
|
* the command execution time. The goal of this implementation is to gracefully
|
||||||
|
* handle disruptions in the communication between Eclipse and GDB.
|
||||||
|
*
|
||||||
|
* The algorithm used by this class is based on the assumption that the command
|
||||||
|
* execution in GDB is sequential even though DSF can send up to 3 commands at
|
||||||
|
* a time to GDB (see {@link AbstractMIControl}).
|
||||||
|
*
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
public class GdbCommandTimeoutManager implements ICommandListener, IPreferenceChangeListener {
|
||||||
|
|
||||||
|
public interface ICommandTimeoutListener {
|
||||||
|
|
||||||
|
void commandTimedOut( ICommandToken token );
|
||||||
|
}
|
||||||
|
|
||||||
|
public final static boolean DEBUG = "true".equals( Platform.getDebugOption( "org.eclipse.cdt.dsf.gdb/debug/timeouts" ) ); //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
|
||||||
|
private class QueueEntry {
|
||||||
|
private long fTimestamp;
|
||||||
|
private ICommandToken fCommandToken;
|
||||||
|
|
||||||
|
private QueueEntry( long timestamp, ICommandToken commandToken ) {
|
||||||
|
super();
|
||||||
|
fTimestamp = timestamp;
|
||||||
|
fCommandToken = commandToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Object#equals(java.lang.Object)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean equals( Object obj ) {
|
||||||
|
if ( obj instanceof QueueEntry ) {
|
||||||
|
return fCommandToken.equals( ((QueueEntry)obj).fCommandToken );
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum TimerThreadState {
|
||||||
|
INITIALIZING,
|
||||||
|
RUNNING,
|
||||||
|
HALTED,
|
||||||
|
SHUTDOWN
|
||||||
|
}
|
||||||
|
|
||||||
|
private class TimerThread extends Thread {
|
||||||
|
|
||||||
|
private BlockingQueue<QueueEntry> fQueue;
|
||||||
|
private int fWaitTimeout = IGdbDebugPreferenceConstants.COMMAND_TIMEOUT_VALUE_DEFAULT;
|
||||||
|
private TimerThreadState fState = TimerThreadState.INITIALIZING;
|
||||||
|
|
||||||
|
TimerThread( BlockingQueue<QueueEntry> queue, int timeout ) {
|
||||||
|
super();
|
||||||
|
setName( "GDB Command Timer Thread" ); //$NON-NLS-1$
|
||||||
|
fQueue = queue;
|
||||||
|
setWaitTimout( timeout );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Thread#run()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
setTimerThreadState( ( getWaitTimeout() > 0 ) ?
|
||||||
|
TimerThreadState.RUNNING : TimerThreadState.HALTED );
|
||||||
|
doRun();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doRun() {
|
||||||
|
while ( getTimerThreadState() != TimerThreadState.SHUTDOWN ) {
|
||||||
|
if ( getTimerThreadState() == TimerThreadState.HALTED ) {
|
||||||
|
halted();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
running();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void halted() {
|
||||||
|
fQueue.clear();
|
||||||
|
try {
|
||||||
|
synchronized( TimerThread.this ) {
|
||||||
|
wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( InterruptedException e ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void running() {
|
||||||
|
try {
|
||||||
|
while( getTimerThreadState() == TimerThreadState.RUNNING ) {
|
||||||
|
// Use the minimum of all timeout values > 0 as the wait timeout.
|
||||||
|
long timeout = getWaitTimeout();
|
||||||
|
QueueEntry entry = fQueue.peek();
|
||||||
|
if ( entry != null ) {
|
||||||
|
// Calculate the time elapsed since the execution of this command started
|
||||||
|
// and compare it with the command's timeout value.
|
||||||
|
// If the elapsed time is greater or equal than the timeout value the command
|
||||||
|
// is marked as timed out. Otherwise, schedule the next check when the timeout
|
||||||
|
// expires.
|
||||||
|
long commandTimeout = getTimeoutForCommand( entry.fCommandToken.getCommand() );
|
||||||
|
|
||||||
|
if ( DEBUG ) {
|
||||||
|
String commandText = entry.fCommandToken.getCommand().toString();
|
||||||
|
if ( commandText.endsWith( "\n" ) ) //$NON-NLS-1$
|
||||||
|
commandText = commandText.substring( 0, commandText.length() - 1 );
|
||||||
|
printDebugMessage( String.format( "Processing command '%s', command timeout is %d", //$NON-NLS-1$
|
||||||
|
commandText, Long.valueOf( commandTimeout ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
long elapsedTime = currentTime - entry.fTimestamp;
|
||||||
|
if ( commandTimeout <= elapsedTime ) {
|
||||||
|
processTimedOutCommand( entry.fCommandToken );
|
||||||
|
fQueue.remove( entry );
|
||||||
|
// Reset the timestamp of the next command in the queue because
|
||||||
|
// regardless how long the command has been in the queue GDB will
|
||||||
|
// start executing it only when the execution of the previous command
|
||||||
|
// is completed.
|
||||||
|
QueueEntry nextEntry = fQueue.peek();
|
||||||
|
if ( nextEntry != null ) {
|
||||||
|
setTimeStamp( currentTime, nextEntry );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Adjust the wait timeout because the time remaining for
|
||||||
|
// the current command to expire may be less than the current wait timeout.
|
||||||
|
timeout = Math.min( timeout, commandTimeout - elapsedTime );
|
||||||
|
|
||||||
|
if ( DEBUG ) {
|
||||||
|
String commandText = entry.fCommandToken.getCommand().toString();
|
||||||
|
if ( commandText.endsWith( "\n" ) ) //$NON-NLS-1$
|
||||||
|
commandText = commandText.substring( 0, commandText.length() - 1 );
|
||||||
|
printDebugMessage( String.format( "Setting timeout %d for command '%s'", Long.valueOf( timeout ), commandText ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
synchronized( TimerThread.this ) {
|
||||||
|
wait( timeout );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( InterruptedException e ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void shutdown() {
|
||||||
|
setTimerThreadState( TimerThreadState.SHUTDOWN );
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void setWaitTimout( int waitTimeout ) {
|
||||||
|
fWaitTimeout = waitTimeout;
|
||||||
|
if ( DEBUG )
|
||||||
|
printDebugMessage( String.format( "Wait timeout is set to %d", Integer.valueOf( fWaitTimeout ) ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized int getWaitTimeout() {
|
||||||
|
return fWaitTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void setTimerThreadState( TimerThreadState state ) {
|
||||||
|
fState = state;
|
||||||
|
interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized TimerThreadState getTimerThreadState() {
|
||||||
|
return fState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String TIMEOUT_TRACE_IDENTIFIER = "[TMO]"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private ICommandControl fCommandControl;
|
||||||
|
private boolean fTimeoutEnabled = false;
|
||||||
|
private int fTimeout = 0;
|
||||||
|
private TimerThread fTimerThread;
|
||||||
|
private BlockingQueue<QueueEntry> fCommandQueue = new LinkedBlockingQueue<QueueEntry>();
|
||||||
|
private CustomTimeoutsMap fCustomTimeouts = new CustomTimeoutsMap();
|
||||||
|
|
||||||
|
private ListenerList fListeners;
|
||||||
|
|
||||||
|
public GdbCommandTimeoutManager( ICommandControl commandControl ) {
|
||||||
|
fCommandControl = commandControl;
|
||||||
|
fListeners = new ListenerList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initialize() {
|
||||||
|
IEclipsePreferences node = InstanceScope.INSTANCE.getNode( GdbPlugin.PLUGIN_ID );
|
||||||
|
|
||||||
|
fTimeoutEnabled = Platform.getPreferencesService().getBoolean(
|
||||||
|
GdbPlugin.PLUGIN_ID,
|
||||||
|
IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT,
|
||||||
|
false,
|
||||||
|
null );
|
||||||
|
|
||||||
|
fTimeout = Platform.getPreferencesService().getInt(
|
||||||
|
GdbPlugin.PLUGIN_ID,
|
||||||
|
IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT_VALUE,
|
||||||
|
IGdbDebugPreferenceConstants.COMMAND_TIMEOUT_VALUE_DEFAULT,
|
||||||
|
null );
|
||||||
|
|
||||||
|
fCustomTimeouts.initializeFromMemento( Platform.getPreferencesService().getString(
|
||||||
|
GdbPlugin.PLUGIN_ID,
|
||||||
|
IGdbDebugPreferenceConstants.PREF_COMMAND_CUSTOM_TIMEOUTS,
|
||||||
|
"", //$NON-NLS-1$
|
||||||
|
null ) );
|
||||||
|
|
||||||
|
node.addPreferenceChangeListener( this );
|
||||||
|
|
||||||
|
fCommandControl.addCommandListener( this );
|
||||||
|
|
||||||
|
fTimerThread = new TimerThread( fCommandQueue, calculateWaitTimeout() );
|
||||||
|
fTimerThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dispose() {
|
||||||
|
fTimerThread.shutdown();
|
||||||
|
fListeners.clear();
|
||||||
|
InstanceScope.INSTANCE.getNode( GdbPlugin.PLUGIN_ID ).removePreferenceChangeListener( this );
|
||||||
|
fCommandControl.removeCommandListener( this );
|
||||||
|
fCommandQueue.clear();
|
||||||
|
fCustomTimeouts.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.dsf.debug.service.command.ICommandListener#commandQueued(org.eclipse.cdt.dsf.debug.service.command.ICommandToken)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void commandQueued( ICommandToken token ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.dsf.debug.service.command.ICommandListener#commandSent(org.eclipse.cdt.dsf.debug.service.command.ICommandToken)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void commandSent( ICommandToken token ) {
|
||||||
|
if ( !isTimeoutEnabled() )
|
||||||
|
return;
|
||||||
|
int commandTimeout = getTimeoutForCommand( token.getCommand() );
|
||||||
|
if ( DEBUG ) {
|
||||||
|
String commandText = token.getCommand().toString();
|
||||||
|
if ( commandText.endsWith( "\n" ) ) //$NON-NLS-1$
|
||||||
|
commandText = commandText.substring( 0, commandText.length() - 1 );
|
||||||
|
printDebugMessage( String.format( "Command '%s' sent, timeout = %d", commandText, Integer.valueOf( commandTimeout ) ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
if ( commandTimeout == 0 )
|
||||||
|
// Skip commands with no timeout
|
||||||
|
return;
|
||||||
|
try {
|
||||||
|
fCommandQueue.put( new QueueEntry( System.currentTimeMillis(), token ) );
|
||||||
|
}
|
||||||
|
catch( InterruptedException e ) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.dsf.debug.service.command.ICommandListener#commandRemoved(org.eclipse.cdt.dsf.debug.service.command.ICommandToken)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void commandRemoved( ICommandToken token ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.dsf.debug.service.command.ICommandListener#commandDone(org.eclipse.cdt.dsf.debug.service.command.ICommandToken, org.eclipse.cdt.dsf.debug.service.command.ICommandResult)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void commandDone( ICommandToken token, ICommandResult result ) {
|
||||||
|
if ( !isTimeoutEnabled() )
|
||||||
|
return;
|
||||||
|
fCommandQueue.remove( new QueueEntry( 0, token ) );
|
||||||
|
if ( DEBUG ) {
|
||||||
|
String commandText = token.getCommand().toString();
|
||||||
|
if ( commandText.endsWith( "\n" ) ) //$NON-NLS-1$
|
||||||
|
commandText = commandText.substring( 0, commandText.length() - 1 );
|
||||||
|
printDebugMessage( String.format( "Command '%s' is done", commandText ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
// Reset the timestamp of the next command in the queue because
|
||||||
|
// regardless how long it has been in the queue GDB will start
|
||||||
|
// executing it only when the execution of the previous command
|
||||||
|
// is completed.
|
||||||
|
QueueEntry nextEntry = fCommandQueue.peek();
|
||||||
|
if ( nextEntry != null ) {
|
||||||
|
setTimeStamp( System.currentTimeMillis(), nextEntry );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void preferenceChange( PreferenceChangeEvent event ) {
|
||||||
|
String property = event.getKey();
|
||||||
|
if ( IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT.equals( property ) ) {
|
||||||
|
// The new value is null when the timeout support is disabled.
|
||||||
|
if ( event.getNewValue() == null || !event.getNewValue().equals( event.getOldValue() ) ) {
|
||||||
|
fTimeoutEnabled = ( event.getNewValue() != null ) ?
|
||||||
|
Boolean.parseBoolean( event.getNewValue().toString() ) : Boolean.FALSE;
|
||||||
|
updateWaitTimeout();
|
||||||
|
fTimerThread.setTimerThreadState( ( fTimerThread.getWaitTimeout() > 0 ) ?
|
||||||
|
TimerThreadState.RUNNING : TimerThreadState.HALTED );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT_VALUE.equals( property ) ) {
|
||||||
|
if ( event.getNewValue() == null || !event.getNewValue().equals( event.getOldValue() ) ) {
|
||||||
|
try {
|
||||||
|
fTimeout = ( event.getNewValue() != null ) ?
|
||||||
|
Integer.parseInt( event.getNewValue().toString() ) :
|
||||||
|
IGdbDebugPreferenceConstants.COMMAND_TIMEOUT_VALUE_DEFAULT;
|
||||||
|
updateWaitTimeout();
|
||||||
|
fTimerThread.setTimerThreadState( ( fTimerThread.getWaitTimeout() > 0 ) ?
|
||||||
|
TimerThreadState.RUNNING : TimerThreadState.HALTED );
|
||||||
|
}
|
||||||
|
catch( NumberFormatException e ) {
|
||||||
|
GdbPlugin.getDefault().getLog().log( new Status( IStatus.ERROR, GdbPlugin.PLUGIN_ID, "Invlaid timeout value" ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( IGdbDebugPreferenceConstants.PREF_COMMAND_CUSTOM_TIMEOUTS.equals( property ) ) {
|
||||||
|
if ( event.getNewValue() instanceof String ) {
|
||||||
|
fCustomTimeouts.initializeFromMemento( (String)event.getNewValue() );
|
||||||
|
}
|
||||||
|
else if ( event.getNewValue() == null ) {
|
||||||
|
fCustomTimeouts.clear();
|
||||||
|
}
|
||||||
|
updateWaitTimeout();
|
||||||
|
fTimerThread.setTimerThreadState( ( fTimerThread.getWaitTimeout() > 0 ) ?
|
||||||
|
TimerThreadState.RUNNING : TimerThreadState.HALTED );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getTimeoutForCommand( ICommand<? extends ICommandResult> command ) {
|
||||||
|
if ( !(command instanceof MICommand<?>) )
|
||||||
|
return 0;
|
||||||
|
@SuppressWarnings( "unchecked" )
|
||||||
|
Integer timeout = fCustomTimeouts.get( ((MICommand<? extends MIInfo>)command).getOperation() );
|
||||||
|
return ( timeout != null ) ? timeout.intValue() : fTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void processTimedOutCommand( ICommandToken token ) {
|
||||||
|
if ( DEBUG ) {
|
||||||
|
String commandText = token.getCommand().toString();
|
||||||
|
if ( commandText.endsWith( "\n" ) ) //$NON-NLS-1$
|
||||||
|
commandText = commandText.substring( 0, commandText.length() - 1 );
|
||||||
|
printDebugMessage( String.format( "Command '%s' is timed out", commandText ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
for ( Object l : fListeners.getListeners() ) {
|
||||||
|
((ICommandTimeoutListener)l).commandTimedOut( token );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCommandTimeoutListener( ICommandTimeoutListener listener ) {
|
||||||
|
fListeners.add( listener );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeCommandTimeoutListener( ICommandTimeoutListener listener ) {
|
||||||
|
fListeners.remove( listener );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateWaitTimeout() {
|
||||||
|
fTimerThread.setWaitTimout( calculateWaitTimeout() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isTimeoutEnabled() {
|
||||||
|
return fTimeoutEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void printDebugMessage( String message ) {
|
||||||
|
System.out.println( String.format( "%s %s %s", GdbPlugin.getDebugTime(), TIMEOUT_TRACE_IDENTIFIER, message ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
private int calculateWaitTimeout() {
|
||||||
|
int waitTimeout = 0;
|
||||||
|
if ( isTimeoutEnabled() ) {
|
||||||
|
waitTimeout = fTimeout;
|
||||||
|
int minCustomTimeout = Integer.MAX_VALUE;
|
||||||
|
for ( Integer t : fCustomTimeouts.values() ) {
|
||||||
|
if ( t.intValue() > 0 ) {
|
||||||
|
minCustomTimeout = Math.min( minCustomTimeout, t.intValue() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( minCustomTimeout > 0 ) {
|
||||||
|
waitTimeout = ( waitTimeout == 0 ) ?
|
||||||
|
minCustomTimeout : Math.min( waitTimeout, minCustomTimeout );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return waitTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTimeStamp( long currentTime, QueueEntry nextEntry ) {
|
||||||
|
if ( nextEntry != null ) {
|
||||||
|
nextEntry.fTimestamp = currentTime;
|
||||||
|
|
||||||
|
if ( DEBUG ) {
|
||||||
|
String commandText = nextEntry.fCommandToken.getCommand().toString();
|
||||||
|
if ( commandText.endsWith( "\n" ) ) //$NON-NLS-1$
|
||||||
|
commandText = commandText.substring( 0, commandText.length() - 1 );
|
||||||
|
printDebugMessage( String.format( "Setting the timestamp for command '%s' to %d", commandText, Long.valueOf( currentTime ) ) ); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,6 +29,7 @@ import java.util.concurrent.BlockingQueue;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
import java.util.concurrent.RejectedExecutionException;
|
import java.util.concurrent.RejectedExecutionException;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
|
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
|
||||||
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
import org.eclipse.cdt.dsf.datamodel.DMContexts;
|
||||||
|
@ -874,6 +875,7 @@ public abstract class AbstractMIControl extends AbstractDsfService
|
||||||
}
|
}
|
||||||
|
|
||||||
void processMIOutput(String line) {
|
void processMIOutput(String line) {
|
||||||
|
|
||||||
MIParser.RecordType recordType = fMiParser.getRecordType(line);
|
MIParser.RecordType recordType = fMiParser.getRecordType(line);
|
||||||
|
|
||||||
if (recordType == MIParser.RecordType.ResultRecord) {
|
if (recordType == MIParser.RecordType.ResultRecord) {
|
||||||
|
@ -885,6 +887,7 @@ public abstract class AbstractMIControl extends AbstractDsfService
|
||||||
* some form of asynchronous notification. Or perhaps general IO.
|
* some form of asynchronous notification. Or perhaps general IO.
|
||||||
*/
|
*/
|
||||||
int id = rr.getToken();
|
int id = rr.getToken();
|
||||||
|
|
||||||
final CommandHandle commandHandle = fRxCommands.remove(id);
|
final CommandHandle commandHandle = fRxCommands.remove(id);
|
||||||
|
|
||||||
if (commandHandle != null) {
|
if (commandHandle != null) {
|
||||||
|
@ -1098,4 +1101,46 @@ public abstract class AbstractMIControl extends AbstractDsfService
|
||||||
fCurrentStackLevel = -1;
|
fCurrentStackLevel = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 4.1
|
||||||
|
*/
|
||||||
|
@ConfinedToDsfExecutor("this.getExecutor()")
|
||||||
|
protected void commandFailed(ICommandToken token, int statusCode, String errorMessage) {
|
||||||
|
if ( !(token instanceof CommandHandle && token.getCommand() instanceof MICommand<?>) )
|
||||||
|
return;
|
||||||
|
final CommandHandle commandHandle = (CommandHandle)token;
|
||||||
|
Integer tokenId = commandHandle.getTokenId();
|
||||||
|
|
||||||
|
// If the timeout value is too small a command can be timed out but still processed by RxThread.
|
||||||
|
// To avoid processing it twice we need to remove it from the command list.
|
||||||
|
CommandHandle h = fRxCommands.remove(tokenId);
|
||||||
|
if (h == null)
|
||||||
|
// Command has already been processed by RxThread.
|
||||||
|
return;
|
||||||
|
|
||||||
|
MIConst value = new MIConst();
|
||||||
|
value.setCString(errorMessage);
|
||||||
|
MIResult result = new MIResult();
|
||||||
|
result.setVariable("msg"); //$NON-NLS-1$
|
||||||
|
result.setMIValue(value);
|
||||||
|
MIResultRecord resultRecord = new MIResultRecord();
|
||||||
|
resultRecord.setToken(tokenId.intValue());
|
||||||
|
resultRecord.setResultClass(MIResultRecord.ERROR);
|
||||||
|
resultRecord.setMIResults(new MIResult[] { result });
|
||||||
|
MIOutput miOutput = new MIOutput(resultRecord, new MIOOBRecord[0]);
|
||||||
|
|
||||||
|
final MIInfo info = commandHandle.getCommand().getResult(miOutput);
|
||||||
|
DataRequestMonitor<MIInfo> rm = commandHandle.getRequestMonitor();
|
||||||
|
|
||||||
|
if ( rm != null ) {
|
||||||
|
rm.setData(info);
|
||||||
|
rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, statusCode, errorMessage, null));
|
||||||
|
rm.done();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now tell the generic listeners about it.
|
||||||
|
*/
|
||||||
|
processCommandDone(commandHandle, info);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,10 @@ public class BaseTestCase {
|
||||||
launchAttributes.put(key, value);
|
launchAttributes.put(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void removeLaunchAttribute(String key) {
|
||||||
|
launchAttributes.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
public static void setGlobalLaunchAttribute(String key, Object value) {
|
public static void setGlobalLaunchAttribute(String key, Object value) {
|
||||||
globalLaunchAttributes.put(key, value);
|
globalLaunchAttributes.put(key, value);
|
||||||
}
|
}
|
||||||
|
@ -206,7 +210,8 @@ public class BaseTestCase {
|
||||||
.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE);
|
.equals(ICDTLaunchConfigurationConstants.DEBUGGER_MODE_CORE);
|
||||||
|
|
||||||
// First check if we should launch gdbserver in the case of a remote session
|
// First check if we should launch gdbserver in the case of a remote session
|
||||||
launchGdbServer();
|
if (reallyLaunchGDBServer())
|
||||||
|
launchGdbServer();
|
||||||
|
|
||||||
ILaunchManager launchMgr = DebugPlugin.getDefault().getLaunchManager();
|
ILaunchManager launchMgr = DebugPlugin.getDefault().getLaunchManager();
|
||||||
ILaunchConfigurationType lcType = launchMgr.getLaunchConfigurationType("org.eclipse.cdt.tests.dsf.gdb.TestLaunch");
|
ILaunchConfigurationType lcType = launchMgr.getLaunchConfigurationType("org.eclipse.cdt.tests.dsf.gdb.TestLaunch");
|
||||||
|
@ -332,4 +337,14 @@ public class BaseTestCase {
|
||||||
BaseTestCase.setLaunchAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUG_NAME, "gdb." + version + (isWindows ? ".exe" : ""));
|
BaseTestCase.setLaunchAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUG_NAME, "gdb." + version + (isWindows ? ".exe" : ""));
|
||||||
BaseTestCase.setLaunchAttribute(ATTR_DEBUG_SERVER_NAME, "gdbserver." + version + (isWindows ? ".exe" : ""));
|
BaseTestCase.setLaunchAttribute(ATTR_DEBUG_SERVER_NAME, "gdbserver." + version + (isWindows ? ".exe" : ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In some tests we need to start a gdbserver session without starting gdbserver.
|
||||||
|
* This method allows super classes of this class control the launch of gdbserver.
|
||||||
|
*
|
||||||
|
* @return whether gdbserver should be started
|
||||||
|
*/
|
||||||
|
protected boolean reallyLaunchGDBServer() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.junit.runners.Suite;
|
||||||
LaunchConfigurationAndRestartTest.class,
|
LaunchConfigurationAndRestartTest.class,
|
||||||
OperationsWhileTargetIsRunningTest.class,
|
OperationsWhileTargetIsRunningTest.class,
|
||||||
PostMortemCoreTest.class,
|
PostMortemCoreTest.class,
|
||||||
|
CommandTimeoutTest.class,
|
||||||
Suite_Sessionless_Tests.class,
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your suite class here */
|
/* Add your suite class here */
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,143 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.tests.dsf.gdb.tests;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.dsf.gdb.IGdbDebugPreferenceConstants;
|
||||||
|
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BaseTestCase;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
|
||||||
|
import org.eclipse.core.runtime.preferences.InstanceScope;
|
||||||
|
import org.eclipse.debug.core.DebugException;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(BackgroundRunner.class)
|
||||||
|
public class CommandTimeoutTest extends BaseTestCase {
|
||||||
|
|
||||||
|
private static boolean fgTimeoutEnabled = false;
|
||||||
|
private static int fgTimeout = IGdbDebugPreferenceConstants.COMMAND_TIMEOUT_VALUE_DEFAULT;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClassMethod() {
|
||||||
|
// Save the original values of the timeout-related preferences
|
||||||
|
fgTimeoutEnabled = Platform.getPreferencesService().getBoolean(
|
||||||
|
GdbPlugin.PLUGIN_ID,
|
||||||
|
IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT,
|
||||||
|
false,
|
||||||
|
null );
|
||||||
|
fgTimeout = Platform.getPreferencesService().getInt(
|
||||||
|
GdbPlugin.PLUGIN_ID,
|
||||||
|
IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT_VALUE,
|
||||||
|
IGdbDebugPreferenceConstants.COMMAND_TIMEOUT_VALUE_DEFAULT,
|
||||||
|
null );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
@Override
|
||||||
|
public void baseBeforeMethod() throws Exception {
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
@Override
|
||||||
|
public void baseAfterMethod() throws Exception {
|
||||||
|
// Restore the timeout preferences
|
||||||
|
IEclipsePreferences node = InstanceScope.INSTANCE.getNode( GdbPlugin.PLUGIN_ID );
|
||||||
|
node.putBoolean( IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT, fgTimeoutEnabled );
|
||||||
|
node.putInt( IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT_VALUE, fgTimeout );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean reallyLaunchGDBServer() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables the timeout support and sets the timeout value to minimal - 1.
|
||||||
|
* Launch is expected to timeout on the first gdb command.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void firstCommandTimedOut() {
|
||||||
|
IEclipsePreferences node = InstanceScope.INSTANCE.getNode( GdbPlugin.PLUGIN_ID );
|
||||||
|
node.putBoolean( IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT, true );
|
||||||
|
node.putInt( IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT_VALUE, 1 );
|
||||||
|
|
||||||
|
try {
|
||||||
|
performLaunchAndTerminate();
|
||||||
|
Assert.fail( "Launch is expected to fail" );
|
||||||
|
}
|
||||||
|
catch( Exception e ) {
|
||||||
|
processException( e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to connect to gdbserver without starting it.
|
||||||
|
* Launch is expected to timeout on "target-remote" command.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void remoteConnectionTimedOut() {
|
||||||
|
if ( !isRemoteSession() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
IEclipsePreferences node = InstanceScope.INSTANCE.getNode( GdbPlugin.PLUGIN_ID );
|
||||||
|
node.putBoolean( IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT, true );
|
||||||
|
node.putInt( IGdbDebugPreferenceConstants.PREF_COMMAND_TIMEOUT_VALUE, 1000 );
|
||||||
|
|
||||||
|
try {
|
||||||
|
performLaunchAndTerminate();
|
||||||
|
Assert.fail( "Launch is expected to fail" );
|
||||||
|
}
|
||||||
|
catch( Exception e ) {
|
||||||
|
processException( e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void performLaunchAndTerminate() throws Exception {
|
||||||
|
super.baseBeforeMethod();
|
||||||
|
super.baseAfterMethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given exception is an instance of {@link CoreException}
|
||||||
|
* with the status code 20100 which indicates that a gdb command has been timed out.
|
||||||
|
*/
|
||||||
|
private void processException( Exception e ) {
|
||||||
|
if ( e instanceof DebugException ) {
|
||||||
|
Throwable t = getExceptionCause( e );
|
||||||
|
Assert.assertTrue(
|
||||||
|
"Unexpected exception",
|
||||||
|
t instanceof CoreException && ((CoreException)t).getStatus().getCode() == 20100 );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Assert.fail( "Unexpected exception type" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Throwable getExceptionCause(Throwable e) {
|
||||||
|
Throwable current = e;
|
||||||
|
while ( current instanceof CoreException ) {
|
||||||
|
Throwable t = ((CoreException)current).getCause();
|
||||||
|
if ( t == null )
|
||||||
|
break;
|
||||||
|
current = t;
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_6_6;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.CommandTimeoutTest;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(BackgroundRunner.class)
|
||||||
|
public class CommandTimeoutTest_6_6 extends CommandTimeoutTest {
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClassMethod_6_6() {
|
||||||
|
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_6_6);
|
||||||
|
}
|
||||||
|
}
|
|
@ -38,7 +38,8 @@ import org.junit.runners.Suite;
|
||||||
LaunchConfigurationAndRestartTest_6_6.class,
|
LaunchConfigurationAndRestartTest_6_6.class,
|
||||||
OperationsWhileTargetIsRunningTest_6_6.class,
|
OperationsWhileTargetIsRunningTest_6_6.class,
|
||||||
PostMortemCoreTest_6_6.class,
|
PostMortemCoreTest_6_6.class,
|
||||||
Suite_Sessionless_Tests.class
|
Suite_Sessionless_Tests.class,
|
||||||
|
CommandTimeoutTest_6_6.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,8 @@ import org.junit.runners.Suite;
|
||||||
MIDisassemblyTest_6_6.class,
|
MIDisassemblyTest_6_6.class,
|
||||||
GDBProcessesTest_6_6.class,
|
GDBProcessesTest_6_6.class,
|
||||||
OperationsWhileTargetIsRunningTest_6_6.class,
|
OperationsWhileTargetIsRunningTest_6_6.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_6_6.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_6_7;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.CommandTimeoutTest;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(BackgroundRunner.class)
|
||||||
|
public class CommandTimeoutTest_6_7 extends CommandTimeoutTest {
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClassMethod_6_7() {
|
||||||
|
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_6_7);
|
||||||
|
}
|
||||||
|
}
|
|
@ -38,7 +38,8 @@ import org.junit.runners.Suite;
|
||||||
LaunchConfigurationAndRestartTest_6_7.class,
|
LaunchConfigurationAndRestartTest_6_7.class,
|
||||||
OperationsWhileTargetIsRunningTest_6_7.class,
|
OperationsWhileTargetIsRunningTest_6_7.class,
|
||||||
PostMortemCoreTest_6_7.class,
|
PostMortemCoreTest_6_7.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_6_7.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,8 @@ import org.junit.runners.Suite;
|
||||||
MIDisassemblyTest_6_7.class,
|
MIDisassemblyTest_6_7.class,
|
||||||
GDBProcessesTest_6_7.class,
|
GDBProcessesTest_6_7.class,
|
||||||
OperationsWhileTargetIsRunningTest_6_7.class,
|
OperationsWhileTargetIsRunningTest_6_7.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_6_7.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_6_8;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.CommandTimeoutTest;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(BackgroundRunner.class)
|
||||||
|
public class CommandTimeoutTest_6_8 extends CommandTimeoutTest {
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClassMethod_6_8() {
|
||||||
|
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_6_8);
|
||||||
|
}
|
||||||
|
}
|
|
@ -38,7 +38,8 @@ import org.junit.runners.Suite;
|
||||||
LaunchConfigurationAndRestartTest_6_8.class,
|
LaunchConfigurationAndRestartTest_6_8.class,
|
||||||
OperationsWhileTargetIsRunningTest_6_8.class,
|
OperationsWhileTargetIsRunningTest_6_8.class,
|
||||||
PostMortemCoreTest_6_8.class,
|
PostMortemCoreTest_6_8.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_6_8.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,8 @@ import org.junit.runners.Suite;
|
||||||
MIDisassemblyTest_6_8.class,
|
MIDisassemblyTest_6_8.class,
|
||||||
GDBProcessesTest_6_8.class,
|
GDBProcessesTest_6_8.class,
|
||||||
OperationsWhileTargetIsRunningTest_6_8.class,
|
OperationsWhileTargetIsRunningTest_6_8.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_6_8.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_0;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.CommandTimeoutTest;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(BackgroundRunner.class)
|
||||||
|
public class CommandTimeoutTest_7_0 extends CommandTimeoutTest {
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClassMethod_7_0() {
|
||||||
|
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_0);
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,7 +40,8 @@ import org.junit.runners.Suite;
|
||||||
OperationsWhileTargetIsRunningTest_7_0.class,
|
OperationsWhileTargetIsRunningTest_7_0.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_0.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_0.class,
|
||||||
PostMortemCoreTest_7_0.class,
|
PostMortemCoreTest_7_0.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_7_0.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,8 @@ import org.junit.runners.Suite;
|
||||||
GDBProcessesTest_7_0.class,
|
GDBProcessesTest_7_0.class,
|
||||||
OperationsWhileTargetIsRunningTest_7_0.class,
|
OperationsWhileTargetIsRunningTest_7_0.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_0.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_0.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_7_0.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_1;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.CommandTimeoutTest;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(BackgroundRunner.class)
|
||||||
|
public class CommandTimeoutTest_7_1 extends CommandTimeoutTest {
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClassMethod_7_1() {
|
||||||
|
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,7 +40,8 @@ import org.junit.runners.Suite;
|
||||||
OperationsWhileTargetIsRunningTest_7_1.class,
|
OperationsWhileTargetIsRunningTest_7_1.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_1.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_1.class,
|
||||||
PostMortemCoreTest_7_1.class,
|
PostMortemCoreTest_7_1.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_7_1.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,8 @@ import org.junit.runners.Suite;
|
||||||
GDBProcessesTest_7_1.class,
|
GDBProcessesTest_7_1.class,
|
||||||
OperationsWhileTargetIsRunningTest_7_1.class,
|
OperationsWhileTargetIsRunningTest_7_1.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_1.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_1.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_7_1.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_2;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.CommandTimeoutTest;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(BackgroundRunner.class)
|
||||||
|
public class CommandTimeoutTest_7_2 extends CommandTimeoutTest {
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClassMethod_7_2() {
|
||||||
|
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_2);
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,7 +40,8 @@ import org.junit.runners.Suite;
|
||||||
OperationsWhileTargetIsRunningTest_7_2.class,
|
OperationsWhileTargetIsRunningTest_7_2.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_2.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_2.class,
|
||||||
PostMortemCoreTest_7_2.class,
|
PostMortemCoreTest_7_2.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_7_2.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,8 @@ import org.junit.runners.Suite;
|
||||||
GDBProcessesTest_7_2.class,
|
GDBProcessesTest_7_2.class,
|
||||||
OperationsWhileTargetIsRunningTest_7_2.class,
|
OperationsWhileTargetIsRunningTest_7_2.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_2.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_2.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_7_2.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_3;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.CommandTimeoutTest;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(BackgroundRunner.class)
|
||||||
|
public class CommandTimeoutTest_7_3 extends CommandTimeoutTest {
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClassMethod_7_3() {
|
||||||
|
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_3);
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,7 +40,8 @@ import org.junit.runners.Suite;
|
||||||
OperationsWhileTargetIsRunningTest_7_3.class,
|
OperationsWhileTargetIsRunningTest_7_3.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_3.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_3.class,
|
||||||
PostMortemCoreTest_7_3.class,
|
PostMortemCoreTest_7_3.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_7_3.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,8 @@ import org.junit.runners.Suite;
|
||||||
GDBProcessesTest_7_3.class,
|
GDBProcessesTest_7_3.class,
|
||||||
OperationsWhileTargetIsRunningTest_7_3.class,
|
OperationsWhileTargetIsRunningTest_7_3.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_3.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_3.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_7_3.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2012 Mentor Graphics 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:
|
||||||
|
* Mentor Graphics - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_4;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.CommandTimeoutTest;
|
||||||
|
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(BackgroundRunner.class)
|
||||||
|
public class CommandTimeoutTest_7_4 extends CommandTimeoutTest {
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeClassMethod_7_4() {
|
||||||
|
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_4);
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,7 +40,8 @@ import org.junit.runners.Suite;
|
||||||
OperationsWhileTargetIsRunningTest_7_4.class,
|
OperationsWhileTargetIsRunningTest_7_4.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_4.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_4.class,
|
||||||
PostMortemCoreTest_7_4.class,
|
PostMortemCoreTest_7_4.class,
|
||||||
Suite_Sessionless_Tests.class
|
CommandTimeoutTest_7_4.class,
|
||||||
|
Suite_Sessionless_Tests.class,
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@ import org.junit.runners.Suite;
|
||||||
GDBProcessesTest_7_4.class,
|
GDBProcessesTest_7_4.class,
|
||||||
OperationsWhileTargetIsRunningTest_7_4.class,
|
OperationsWhileTargetIsRunningTest_7_4.class,
|
||||||
OperationsWhileTargetIsRunningNonStopTest_7_4.class,
|
OperationsWhileTargetIsRunningNonStopTest_7_4.class,
|
||||||
|
CommandTimeoutTest_7_4.class,
|
||||||
Suite_Sessionless_Tests.class
|
Suite_Sessionless_Tests.class
|
||||||
/* Add your test class here */
|
/* Add your test class here */
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Reference in a new issue