aboutsummaryrefslogtreecommitdiff
path: root/www/deno/files/patch-ext_os_sys__info.rs
blob: 87763d5552b23f2cf1f9afc34902dafb94446d99 (plain) (blame)
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];