blob: f54af2e537a2e64b3e7776eda0268c8f199b35c0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Ericsson
*
* 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 396268)
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Marc Dumais
* TODO: extend to more than the tick counters.
* @see also http://www.linuxhowtos.org/System/procstat.htm
*/
public class ProcStatParser {
private ProcStatCounters cpuCoreCounters;
private ProcStatCounters cpuCoreCountersOld;
public ProcStatParser() {
}
/**
* Read and parse the /proc/stat file given as param
* @param fileName
*/
public void parseStatFile(String fileName) throws FileNotFoundException, NumberFormatException {
cpuCoreCountersOld = cpuCoreCounters;
File statFile = new File(fileName);
if (!statFile.exists()) {
throw new FileNotFoundException();
}
cpuCoreCounters = new ProcStatCounters();
BufferedReader reader = null;
try {
String coreId;
Reader r = new InputStreamReader(new FileInputStream(statFile));
reader = new BufferedReader(r);
String line;
// ex: "cpu0 2048635 3195 385292 66149962 895977 22 36130 0 0 0"
// note: we intentionally do not catch the "cpu" (without a core number) line.
Pattern patternCpu = Pattern.compile("^(cpu[0-9]+)(.*)$"); //$NON-NLS-1$
while ((line = reader.readLine()) != null) {
line = line.trim();
// catch "cpu" lines from /proc/stat
Matcher matcherCpu = patternCpu.matcher(line);
if (matcherCpu.find()) {
Vector<Integer> ticks = new Vector<>();
coreId = matcherCpu.group(1);
// extract the counters for current cpu line
for (String tick : matcherCpu.group(2).trim().split("\\s+")) { //$NON-NLS-1$
ticks.add(Integer.parseInt(tick));
}
cpuCoreCounters.addTickCounters(coreId, ticks.toArray(new Integer[ticks.size()]));
}
}
} catch (IOException e) {
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
/* Don't care */}
reader = null;
}
}
/**
* @return a Map of the computed CPU/core loads. The load of individual
* CPUs/cores can be found with keys "cpuN", where N is the CPU/core
* number, starting with 0, as found in /proc/stat .
*
*/
public ProcStatCoreLoads getCpuLoad() {
return cpuCoreCounters.computeLoads(cpuCoreCountersOld);
}
}