|
@@ -203,30 +203,33 @@ fn read_cpu_ranges(path: &'static str) -> Result<Vec<u32>, (&'static str, io::Er
|
|
(|| {
|
|
(|| {
|
|
let data = fs::read_to_string(path)?;
|
|
let data = fs::read_to_string(path)?;
|
|
parse_cpu_ranges(data.trim())
|
|
parse_cpu_ranges(data.trim())
|
|
- .map_err(|range| io::Error::new(io::ErrorKind::InvalidData, range))
|
|
|
|
})()
|
|
})()
|
|
.map_err(|error| (path, error))
|
|
.map_err(|error| (path, error))
|
|
}
|
|
}
|
|
|
|
|
|
-fn parse_cpu_ranges(data: &str) -> Result<Vec<u32>, &str> {
|
|
|
|
- let mut cpus = Vec::new();
|
|
|
|
- for range in data.split(',') {
|
|
|
|
- cpus.extend({
|
|
|
|
- match range
|
|
|
|
- .splitn(2, '-')
|
|
|
|
- .map(u32::from_str)
|
|
|
|
- .collect::<Result<Vec<_>, _>>()
|
|
|
|
- .map_err(|ParseIntError { .. }| range)?
|
|
|
|
- .as_slice()
|
|
|
|
- {
|
|
|
|
- &[] | &[_, _, _, ..] => return Err(range),
|
|
|
|
- &[start] => start..=start,
|
|
|
|
- &[start, end] => start..=end,
|
|
|
|
- }
|
|
|
|
|
|
+fn parse_cpu_ranges(data: &str) -> Result<Vec<u32>, io::Error> {
|
|
|
|
+ data.split(',')
|
|
|
|
+ .map(|range| {
|
|
|
|
+ let mut iter = range
|
|
|
|
+ .split('-')
|
|
|
|
+ .map(|s| s.parse::<u32>().map_err(|ParseIntError { .. }| range));
|
|
|
|
+ let start = iter.next().unwrap()?; // str::split always returns at least one element.
|
|
|
|
+ let end = match iter.next() {
|
|
|
|
+ None => start,
|
|
|
|
+ Some(end) => {
|
|
|
|
+ if iter.next().is_some() {
|
|
|
|
+ return Err(range);
|
|
|
|
+ }
|
|
|
|
+ end?
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ Ok(start..=end)
|
|
|
|
+ })
|
|
|
|
+ .try_fold(Vec::new(), |mut cpus, range| {
|
|
|
|
+ let range = range.map_err(|range| io::Error::new(io::ErrorKind::InvalidData, range))?;
|
|
|
|
+ cpus.extend(range);
|
|
|
|
+ Ok(cpus)
|
|
})
|
|
})
|
|
- }
|
|
|
|
-
|
|
|
|
- Ok(cpus)
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/// Loads kernel symbols from `/proc/kallsyms`.
|
|
/// Loads kernel symbols from `/proc/kallsyms`.
|