blob: 9ba9aab526c37f45484e421d75f44fea60615242 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Ericsson and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.cdt.debug.gdbjtag.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress;
import org.eclipse.cdt.dsf.gdb.service.IGDBBackend;
import org.eclipse.cdt.dsf.mi.service.IMICommandControl;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
/**
* Subclass for GDB >= 7.12.
*
* @since 9.1
*/
public class GDBJtagDSFFinalLaunchSequence_7_12 extends GDBJtagDSFFinalLaunchSequence_7_7 {
public GDBJtagDSFFinalLaunchSequence_7_12(DsfSession session, Map<String, Object> attributes,
RequestMonitorWithProgress rm) {
super(session, attributes, rm);
}
@Override
protected String[] getExecutionOrder(String group) {
if (GROUP_TOP_LEVEL.equals(group)) {
// Initialize the list with the steps from the base class
List<String> orderList = new ArrayList<>(Arrays.asList(super.getExecutionOrder(GROUP_TOP_LEVEL)));
// Add the new step after we source the gdbinit file to make sure the user
// cannot change this behavior
orderList.add(orderList.indexOf("stepSourceGDBInitFile") + 1, //$NON-NLS-1$
"stepSetTargetAsync"); //$NON-NLS-1$
return orderList.toArray(new String[orderList.size()]);
}
return super.getExecutionOrder(group);
}
@Execute
public void stepSetTargetAsync(RequestMonitor rm) {
// Processing this request after sourcing the gdbinit file to make sure the user
// cannot change this behavior
DsfServicesTracker tracker = new DsfServicesTracker(Activator.getBundleContext(), getSession().getId());
IMICommandControl commandControl = tracker.getService(IMICommandControl.class);
IGDBBackend gdbBackEnd = tracker.getService(IGDBBackend.class);
tracker.dispose();
if (commandControl != null && gdbBackEnd != null) {
// Use target async when interfacing with the full GDB console (i.e. minimum GDB version 7.12)
// otherwise explicitly set it to off.
commandControl.queueCommand(commandControl.getCommandFactory()
.createMIGDBSetTargetAsync(commandControl.getContext(), gdbBackEnd.useTargetAsync()),
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
@Override
protected void handleError() {
// Accept errors for older GDBs
rm.done();
}
});
} else {
// Should not happen
rm.done();
}
}
}