Repository: GuillaumeGomez/sysinfo (language: rust)

Issue:
Hot plug support 
Currently at least what i teated with linux, cpu hotplug is not supported for continues refresh.
 I was wondering if it's possible to add a refresh that also refresh the number of cores, before it refresh the stats, to avoid crashes/ wrong view

Thanks


Discussion / hints:
I didn't even know it was something that could happen. So yes, I'm very open into adding the possibility to refresh the list of CPUs.
Some environment especially vm in cloud scale-up/down, and also Big/little schedulers (mobile phones) shut on/off the cores all the time.
Also thanks for the fast reply!
And let me know if i can contribute! 
If you're interested into adding this feature, don't hesitate to go ahead.

Fix patch:
diff --git a/src/common.rs b/src/common.rs
index ba987610b..e4ddd20f1 100644
--- a/src/common.rs
+++ b/src/common.rs
@@ -199,6 +199,27 @@ impl System {
         self.refresh_cpu_specifics(CpuRefreshKind::new().with_frequency())
     }
 
+    /// Refreshes the list of CPU.
+    ///
+    /// Normally, this should almost never be needed as it's pretty rare for a computer
+    /// to add a CPU while running, but it's possible on some computers which shutdown
+    /// CPU if the load is low enough.
+    ///
+    /// The `refresh_kind` argument tells what information you want to be retrieved
+    /// for each CPU.
+    ///
+    /// ```no_run
+    /// use sysinfo::{CpuRefreshKind, System};
+    ///
+    /// let mut s = System::new_all();
+    /// // We already have the list of CPU filled, but we want to recompute it
+    /// // in case new CPUs were added.
+    /// s.refresh_cpu_list(CpuRefreshKind::everything());
+    /// ```
+    pub fn refresh_cpu_list(&mut self, refresh_kind: CpuRefreshKind) {
+        self.inner.refresh_cpu_list(refresh_kind);
+    }
+
     /// Refreshes all information related to CPUs information.
     ///
     /// If you only want the CPU usage, use [`System::refresh_cpu_usage`] instead.
diff --git a/src/unix/apple/system.rs b/src/unix/apple/system.rs
index c58f86a91..f9f118dcc 100644
--- a/src/unix/apple/system.rs
+++ b/src/unix/apple/system.rs
@@ -169,6 +169,11 @@ impl SystemInner {
         self.cpus.refresh(refresh_kind, self.port);
     }
 
+    pub(crate) fn refresh_cpu_list(&mut self, refresh_kind: CpuRefreshKind) {
+        self.cpus = CpusWrapper::new();
+        self.cpus.refresh(refresh_kind, self.port);
+    }
+
     #[cfg(any(target_os = "ios", feature = "apple-sandbox"))]
     pub(crate) fn refresh_processes_specifics(
         &mut self,
diff --git a/src/unix/freebsd/system.rs b/src/unix/freebsd/system.rs
index 05eb9987e..ecbf6227a 100644
--- a/src/unix/freebsd/system.rs
+++ b/src/unix/freebsd/system.rs
@@ -68,6 +68,11 @@ impl SystemInner {
         self.cpus.refresh(refresh_kind)
     }
 
+    pub(crate) fn refresh_cpu_list(&mut self, refresh_kind: CpuRefreshKind) {
+        self.cpus = CpusWrapper::new();
+        self.cpus.refresh(refresh_kind);
+    }
+
     pub(crate) fn refresh_processes_specifics(
         &mut self,
         filter: Option<&[Pid]>,
diff --git a/src/unix/linux/system.rs b/src/unix/linux/system.rs
index 4742eca67..c4aa9be80 100644
--- a/src/unix/linux/system.rs
+++ b/src/unix/linux/system.rs
@@ -505,6 +505,11 @@ impl SystemInner {
                 })
         }
     }
+
+    pub(crate) fn refresh_cpu_list(&mut self, refresh_kind: CpuRefreshKind) {
+        self.cpus = CpusWrapper::new();
+        self.refresh_cpu_specifics(refresh_kind);
+    }
 }
 
 fn read_u64(filename: &str) -> Option<u64> {
diff --git a/src/unknown/system.rs b/src/unknown/system.rs
index 19aada516..1ada65327 100644
--- a/src/unknown/system.rs
+++ b/src/unknown/system.rs
@@ -29,6 +29,8 @@ impl SystemInner {
 
     pub(crate) fn refresh_cpu_specifics(&mut self, _refresh_kind: CpuRefreshKind) {}
 
+    pub(crate) fn refresh_cpu_list(&mut self, _refresh_kind: CpuRefreshKind) {}
+
     pub(crate) fn refresh_processes_specifics(
         &mut self,
         _filter: Option<&[Pid]>,
diff --git a/src/windows/system.rs b/src/windows/system.rs
index 267a978b9..77a90a279 100644
--- a/src/windows/system.rs
+++ b/src/windows/system.rs
@@ -138,6 +138,11 @@ impl SystemInner {
         }
     }
 
+    pub(crate) fn refresh_cpu_list(&mut self, refresh_kind: CpuRefreshKind) {
+        self.cpus = CpusWrapper::new();
+        self.refresh_cpu_specifics(refresh_kind);
+    }
+
     pub(crate) fn refresh_memory_specifics(&mut self, refresh_kind: MemoryRefreshKind) {
         unsafe {
             if refresh_kind.ram() {


Test patch: