Have a working thing!
parent
9be5e6b976
commit
58eba9a315
@ -0,0 +1,118 @@
|
||||
use lazy_static::lazy_static;
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct Cpu {
|
||||
pub id: usize,
|
||||
pub package: usize,
|
||||
pub die: usize,
|
||||
pub core: usize,
|
||||
pub layer_0: Option<usize>,
|
||||
pub layer_1: Option<usize>,
|
||||
pub layer_2: Option<usize>,
|
||||
pub layer_3: Option<usize>,
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref CPUS: Box<[Cpu]> = get_cpus().into_boxed_slice();
|
||||
static ref CPU_LIST: CpuList = CpuList { list: &*CPUS };
|
||||
}
|
||||
|
||||
pub fn get_cpus() -> Vec<Cpu> {
|
||||
if cfg!(target_os = "linux") {
|
||||
return crate::cpu_list::linux::get_cpus();
|
||||
} else {
|
||||
unimplemented!();
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub struct CpuList {
|
||||
list: &'static [Cpu],
|
||||
}
|
||||
|
||||
impl CpuList {
|
||||
pub fn _get() -> CpuList {
|
||||
return *CPU_LIST;
|
||||
}
|
||||
|
||||
pub fn _amount() -> usize {
|
||||
CPU_LIST.len()
|
||||
}
|
||||
|
||||
pub fn _load() -> CpuListOwned {
|
||||
CpuListOwned { list: get_cpus() }
|
||||
}
|
||||
|
||||
pub fn adjacent(amount: usize) -> Option<&'static [Cpu]> {
|
||||
CPU_LIST.get_adjacent(amount)
|
||||
}
|
||||
|
||||
pub fn len(&self) -> usize {
|
||||
self.list.len()
|
||||
}
|
||||
|
||||
pub fn _as_slice(&self) -> &[Cpu] {
|
||||
self.list
|
||||
}
|
||||
|
||||
pub fn get_adjacent(&self, amount: usize) -> Option<&[Cpu]> {
|
||||
if self.len() < amount {
|
||||
None
|
||||
} else {
|
||||
Some(&self.list[..amount])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct CpuListOwned {
|
||||
list: Vec<Cpu>,
|
||||
}
|
||||
|
||||
impl CpuListOwned {}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
mod linux {
|
||||
use crate::cpu_list::Cpu;
|
||||
use std::fs::read_to_string;
|
||||
use std::str::FromStr;
|
||||
|
||||
pub fn get_cpus() -> Vec<Cpu> {
|
||||
let cpu = std::fs::read_dir("/sys/devices/system/cpu")
|
||||
.expect("Failed to read /sys/devices/system/cpu, no /sys mounted?");
|
||||
let mut cpus = vec![];
|
||||
for cpu_dir in cpu {
|
||||
let cpu_dir = cpu_dir.unwrap();
|
||||
let file_name = cpu_dir.file_name();
|
||||
let cpu_name = file_name.to_str().unwrap();
|
||||
if cpu_name.starts_with("cpu") && cpu_name[3..].chars().all(|x| x.is_ascii_digit()) {
|
||||
let cpu_id = usize::from_str(&cpu_name[3..]).unwrap();
|
||||
let topology = cpu_dir.path();
|
||||
let read_id = |name: &str| -> Option<usize> {
|
||||
let mut path = topology.clone();
|
||||
path.push(name);
|
||||
let id_str = read_to_string(&path).ok()?;
|
||||
usize::from_str(id_str.trim_end()).ok()
|
||||
};
|
||||
cpus.push(Cpu {
|
||||
id: cpu_id,
|
||||
package: read_id("topology/physical_package_id").unwrap(),
|
||||
die: read_id("topology/die_id").unwrap(),
|
||||
core: read_id("topology/core_id").unwrap(),
|
||||
layer_0: read_id("cache/index0/id"),
|
||||
layer_1: read_id("cache/index1/id"),
|
||||
layer_2: read_id("cache/index2/id"),
|
||||
layer_3: read_id("cache/index3/id"),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
cpus.sort_by_key(|x| {
|
||||
(
|
||||
x.package, x.die, x.layer_3, x.layer_2, x.layer_1, x.layer_0, x.core, x.id,
|
||||
)
|
||||
});
|
||||
|
||||
cpus
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
use std::collections::HashMap;
|
||||
use vore_core::VirtualMachine;
|
||||
use std::os::unix::net::UnixListener;
|
||||
|
||||
struct RPCConnection {}
|
||||
|
||||
struct DaemonState {
|
||||
machines: HashMap<String, VirtualMachine>,
|
||||
connections: Vec<RPCConnection>,
|
||||
rpc_listener: UnixListener,
|
||||
}
|
||||
|
||||
impl DaemonState {
|
||||
pub fn wait() {
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue