1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
--- ext/os/sys_info.rs.orig 2025-04-03 11:12:07 UTC
+++ ext/os/sys_info.rs
@@ -2,6 +2,9 @@ use std::sync::Once;
#[cfg(target_family = "windows")]
use std::sync::Once;
+#[cfg(target_os = "freebsd")]
+use libc;
+
type LoadAvg = (f64, f64, f64);
const DEFAULT_LOADAVG: LoadAvg = (0.0, 0.0, 0.0);
@@ -193,6 +196,26 @@ pub fn hostname() -> String {
}
}
+#[cfg(target_os = "freebsd")]
+pub fn sysctlbyname<T: Sized>(name: &[u8], oldp: &mut T) -> bool {
+ let mut oldlenp = std::mem::size_of::<T>() as libc::size_t;
+
+ unsafe {
+ let res = libc::sysctlbyname(
+ name.as_ptr() as *const libc::c_char,
+ oldp as *mut _ as *mut _,
+ &mut oldlenp,
+ std::ptr::null_mut(),
+ 0,
+ );
+ if res != 0 {
+ return false;
+ } else {
+ return true;
+ }
+ }
+}
+
#[derive(serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MemInfo {
@@ -243,6 +266,44 @@ pub fn mem_info() -> Option<MemInfo> {
}
}
}
+
+ #[cfg(target_os = "freebsd")]
+ {
+ let mut v_page_count = 0;
+ let mut v_free_count = 0;
+ let mut v_inactive_count = 0;
+ let mut v_laundry_count = 0;
+
+ if sysctlbyname(b"vm.stats.vm.v_page_count\0", &mut v_page_count) == false {
+ v_page_count = 0;
+ }
+
+ if sysctlbyname(b"vm.stats.vm.v_free_count\0", &mut v_free_count) == false {
+ v_free_count = 0;
+ }
+
+ if sysctlbyname(b"vm.stats.vm.v_inactive_count\0", &mut v_inactive_count) == false {
+ v_inactive_count = 0;
+ }
+
+ if sysctlbyname(b"vm.stats.vm.v_laundry_count\0", &mut v_laundry_count) == false {
+ v_laundry_count = 0;
+ }
+
+ // SAFETY: libc call (get system page size)
+ let pagesize = unsafe { libc::sysconf(libc::_SC_PAGESIZE) } as u64;
+
+ let mem_inactive = v_inactive_count * pagesize;
+ let mem_laundry = v_laundry_count * pagesize;
+
+ mem_info.total = v_page_count * pagesize;
+ mem_info.free = v_free_count * pagesize;
+ mem_info.available = mem_inactive + mem_laundry + mem_info.free;
+
+// mem_info.swap_total = sys.total_swap();
+// mem_info.swap_free = sys.free_swap();
+ }
+
#[cfg(target_vendor = "apple")]
{
let mut mib: [i32; 2] = [0, 0];
|