/*******************************************************************************
* Copyright (c) 2012, 2015 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc Khouzam (Ericsson) - Initial API and implementation
* Marc Dumais (Ericsson) - bug 464184
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Vector;
import org.eclipse.cdt.dsf.gdb.service.IGDBHardwareAndOS2.IResourcesInformation;
import org.eclipse.cdt.internal.core.ICoreInfo;
/**
*/
public class CoreList {
private ICoreInfo[] fCoreList;
private String fCoreFileName;
private IResourcesInformation fResourcesInfo;
private static final String PROCESSOR_ID_STR = "processor"; //$NON-NLS-1$
private static final String PHYSICAL_ID_STR = "physical id"; //$NON-NLS-1$
/** Default constructor - assumes the info comes from file /proc/cpuinfo */
public CoreList() {
fCoreFileName = "/proc/cpuinfo"; //$NON-NLS-1$
}
/** Alternate constructor - info comes from a file passed as parameter */
public CoreList(String fileName) {
fCoreFileName = fileName;
}
/**
* Alternate constructor - info comes from IResourcesInformation object,
* that was obtained from GDB
*/
public CoreList(IResourcesInformation info) {
fResourcesInfo = info;
}
/** Returns the list of cores. The core information will only
* be parsed once and the result cached. To force a re-parse,
* one must create a new CoreList object. */
public ICoreInfo[] getCoreList() {
// already parsed info?
if (fCoreList != null) {
return fCoreList;
}
if (fCoreFileName != null) {
getCoreListFromFile();
}
else if (fResourcesInfo != null) {
getCoreListFromResourceInfo();
}
return fCoreList;
}
/**
* This method will only parse /proc/cpuinfo once and cache
* the result. To force a re-parse, one must create a new
* CoreList object.
*/
private void getCoreListFromFile() {
File cpuInfo = new File(fCoreFileName);
Vector<ICoreInfo> coreInfo = new Vector<ICoreInfo>();
BufferedReader reader = null;
try {
String processorId = null;
String physicalId = null;
Reader r = new InputStreamReader(new FileInputStream(cpuInfo));
reader = new BufferedReader(r);
String line;
while ((line = reader.readLine()) != null) {
line = line.trim();
if (line.startsWith(PROCESSOR_ID_STR)) {
if (processorId != null) {
// We are already at the next 'processor' entry, without
// having found the 'physical id' entry. This means
// there is a single physical CPU.
physicalId = "0"; //$NON-NLS-1$
coreInfo.add(new CoreInfo(processorId, physicalId));
processorId = null;
}
// Found the processor id of this core, so store it temporarily
processorId = line.split(":")[1].trim(); //$NON-NLS-1$
} else if (line.startsWith(PHYSICAL_ID_STR)) {
// Found the physical id of this core, so store it temporarily
assert physicalId == null;
physicalId = line.split(":")[1].trim(); //$NON-NLS-1$
coreInfo.add(new CoreInfo(processorId, physicalId));
// Get ready to look for the next core.
processorId = null;
physicalId = null;
}
}
if (processorId != null) {
// This will happen when there is no 'physical id' field
coreInfo.add(new CoreInfo(processorId, "0")); //$NON-NLS-1$
}
} catch (IOException e) {
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {/* Don't care */}
reader = null;
}
fCoreList = coreInfo.toArray(new ICoreInfo[coreInfo.size()]);
}
private void getCoreListFromResourceInfo() {
Vector<ICoreInfo> coreInfo = new Vector<ICoreInfo>();
int processorIdIndex = -1;
int physicalIdIndex = -1;
String processorId = null;
String physicalId = null;
int column = 0;
// find the indexes of the columns that we need
for (String col : fResourcesInfo.getColumnNames()) {
if (col.equalsIgnoreCase(PROCESSOR_ID_STR)) {
processorIdIndex = column;
}
else if (col.equalsIgnoreCase(PHYSICAL_ID_STR)) {
physicalIdIndex = column;
}
column++;
}
if (processorIdIndex >= 0) {
// for each entry
for (String[] line : fResourcesInfo.getContent()) {
processorId = line[processorIdIndex];
if (physicalIdIndex >= 0) {
physicalId = line[physicalIdIndex];
}
// This will happen when there is no 'physical id' field. This means
// there is a single physical CPU.
else {
physicalId = "0"; //$NON-NLS-1$
}
coreInfo.add(new CoreInfo(processorId, physicalId));
// Get ready to look for the next core.
processorId = null;
physicalId = null;
}
}
fCoreList = coreInfo.toArray(new ICoreInfo[coreInfo.size()]);
}
}