aboutsummaryrefslogtreecommitdiff
path: root/java/openjdk11/files/patch-src_jdk.management_unix_native_libmanagement__ext_OperatingSystemImpl.c
blob: 4983d68853d163364e64591e6946b1268ed052db (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
85
86
87
88
89
--- src/jdk.management/unix/native/libmanagement_ext/OperatingSystemImpl.c.orig	2025-04-19 23:57:10 UTC
+++ src/jdk.management/unix/native/libmanagement_ext/OperatingSystemImpl.c
@@ -58,6 +58,7 @@
 #include <unistd.h>
 
 #ifdef __FreeBSD__
+#include <sys/user.h>
 #include <vm/vm_param.h>
 #endif
 
@@ -261,23 +262,43 @@ Java_com_sun_management_internal_OperatingSystemImpl_g
     }
     return t_info.virtual_size;
 #elif defined(__FreeBSD__)
-    FILE *fp;
-    unsigned long end, start;
-    jlong total = 0;
+    int mib[4];
+    struct kinfo_vmentry *kve;
+    long total = 0;
+    size_t len = 0;
+    int error;
+    char *buf, *bp, *eb;
 
-    if ((fp = fopen("/proc/curproc/map", "r")) == NULL) {
-        throw_internal_error(env, "Unable to open /proc/curproc/map");
+    mib[0] = CTL_KERN;
+    mib[1] = KERN_PROC;
+    mib[2] = KERN_PROC_VMMAP;
+    mib[3] = getpid();
+    error = sysctl(mib, 4, NULL, &len, NULL, 0);
+    if (error) {
+        throw_internal_error(env, "Cannot sysctl(kern.proc.vvmap)");
         return -1;
     }
-
-    for (;;) {
-       // Ignore everything except start and end entries
-       if (fscanf(fp, "0x%lx 0x%lx %*[^\n]\n", &start, &end) != 2 || start > end)
-           break;
-       total += end - start;
+    len = len * 4 / 3;
+    buf = malloc(len);
+    if (buf == NULL) {
+        throw_internal_error(env, "Fail to allocate memory");
+        return -1;
     }
-
-    fclose(fp);
+    error = sysctl(mib, 4, buf, &len, NULL, 0);
+    if (error) {
+        throw_internal_error(env, "Cannot sysctl(kern.proc.vvmap)");
+        return -1;
+    }
+    bp = buf;
+    eb = buf + len;
+    while (bp < eb) {
+        kve = (struct kinfo_vmentry *)(uintptr_t)bp;
+        if (kve->kve_structsize == 0)
+            break;
+        bp += kve->kve_structsize;
+        total += kve->kve_end - kve->kve_start;
+    }
+    free(buf);
     return total;
 #else /* _ALLBSD_SOURCE */
     /*
@@ -487,6 +508,21 @@ Java_com_sun_management_internal_OperatingSystemImpl_g
     return nfiles;
 #elif defined(__OpenBSD__)
     return getdtablecount();
+#elif defined(__FreeBSD__)
+    int mib[4];
+    int error;
+    int nfds;
+    size_t len;
+
+    len = sizeof(nfds);
+    mib[0] = CTL_KERN;
+    mib[1] = KERN_PROC;
+    mib[2] = KERN_PROC_NFDS;
+    mib[3] = 0;
+
+    if (sysctl(mib, 4, &nfds, &len, NULL, 0) == -1)
+        return -1;
+    return nfds;
 #else /* solaris/linux */
     DIR *dirp;
     struct dirent64* dentp;