blob: 84a56ebb196eadafb10b89e7311bc66a7f4b34a2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 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
*
* Contributors:
* Marc Dumais (Ericsson) - Initial API and implementation (bug 464184)
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.service;
import org.eclipse.cdt.dsf.concurrent.ConfinedToDsfExecutor;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.gdb.internal.CoreList;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.internal.core.ICoreInfo;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
/**
* This extension to the GDBHardwareAndOS service takes advantage of GDB providing CPU information (on Linux)
* @since 4.7
*/
public class GDBHardwareAndOS_7_10 extends GDBHardwareAndOS_7_5 {
private ICoreInfo[] coreListCache;
final static String CPUResourceClass = "cpus"; //$NON-NLS-1$
/** constructor */
public GDBHardwareAndOS_7_10(DsfSession session) {
super(session);
}
@Override
public void getCPUs(final IHardwareTargetDMContext dmc, final DataRequestMonitor<ICPUDMContext[]> rm) {
if (!getSessionInitializationComplete()) {
// We are not ready to answer yet
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, "Debug session not initialized yet", //$NON-NLS-1$
null));
return;
}
if (coreListCache != null) {
rm.done(parseCoresInfoForCPUs(dmc, coreListCache));
return;
}
getResourcesInformation(dmc, CPUResourceClass,
new DataRequestMonitor<IResourcesInformation>(getExecutor(), rm) {
@Override
@ConfinedToDsfExecutor("getExecutor()")
protected void handleCompleted() {
if (isSuccess()) {
coreListCache = new CoreList(getData()).getCoreList();
rm.done(parseCoresInfoForCPUs(dmc, coreListCache));
} else {
// not Linux?
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED,
"Operation not supported", null)); //$NON-NLS-1$
}
}
});
}
@Override
public void getCores(IDMContext dmc, final DataRequestMonitor<ICoreDMContext[]> rm) {
if (!getSessionInitializationComplete()) {
// We are not ready to answer yet
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, "Debug session not initialized yet", //$NON-NLS-1$
null));
return;
}
if (dmc instanceof ICPUDMContext) {
// Get the cores under this particular CPU
final ICPUDMContext cpuDmc = (ICPUDMContext) dmc;
if (coreListCache != null) {
rm.done(parseCoresInfoForCores(cpuDmc, coreListCache));
return;
}
getResourcesInformation(dmc, CPUResourceClass,
new DataRequestMonitor<IResourcesInformation>(getExecutor(), rm) {
@Override
@ConfinedToDsfExecutor("getExecutor()")
protected void handleCompleted() {
if (isSuccess()) {
coreListCache = new CoreList(getData()).getCoreList();
rm.done(parseCoresInfoForCores(cpuDmc, coreListCache));
} else {
// not Linux?
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, NOT_SUPPORTED,
"Operation not supported", null)); //$NON-NLS-1$
}
}
});
} else {
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_HANDLE, "Invalid DMC type", null)); //$NON-NLS-1$
}
}
@Override
public void flushCache(IDMContext context) {
coreListCache = null;
super.flushCache(context);
}
}