summaryrefslogtreecommitdiff
path: root/java/openjdk18
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2025-06-27 16:59:37 +0200
committerBaptiste Daroussin <bapt@FreeBSD.org>2025-06-27 17:14:08 +0200
commit3a407ba074c037ab429e357307016648b4d5ed33 (patch)
tree37dd87a406495866fc7e1b806e1fe3be672ad104 /java/openjdk18
parentwww/apache24: Allow overriding USERS and GROUPS via make.conf (diff)
openjdk: remove need for fdescfs(5) and probably procfs(5)
Implement getCommittedVirtualMemorySize() directly using sysctl kern.proc.vmmap Implement getOpenFileDescriptorCount() directly using sysctl kern.proc.nfds Note on openjdk17 use closefrom where possible (note this use case is only in openjdk 17, 21, 23 and 24) Remove the message about the use of fdescfs(5) as this is not needed for sure, keep the information about procfs(5) as I have not analysed enough the source code to make sure it is not used anywhere else, but I don't think it is.
Diffstat (limited to 'java/openjdk18')
-rw-r--r--java/openjdk18/Makefile2
-rw-r--r--java/openjdk18/files/patch-src_jdk.management_unix_native_libmanagement__ext_OperatingSystemImpl.c89
-rw-r--r--java/openjdk18/pkg-message6
3 files changed, 92 insertions, 5 deletions
diff --git a/java/openjdk18/Makefile b/java/openjdk18/Makefile
index f2afc74762f9..2ef6fa17ed08 100644
--- a/java/openjdk18/Makefile
+++ b/java/openjdk18/Makefile
@@ -1,7 +1,7 @@
PORTNAME= openjdk
DISTVERSIONPREFIX= jdk-
DISTVERSION= ${JDK_MAJOR_VERSION}.${JDK_MINOR_VERSION}.${JDK_PATCH_VERSION}+${JDK_BUILD_NUMBER}-${BSD_JDK_VERSION}
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= java devel
PKGNAMESUFFIX?= ${JDK_MAJOR_VERSION}
diff --git a/java/openjdk18/files/patch-src_jdk.management_unix_native_libmanagement__ext_OperatingSystemImpl.c b/java/openjdk18/files/patch-src_jdk.management_unix_native_libmanagement__ext_OperatingSystemImpl.c
new file mode 100644
index 000000000000..0e4c9e8aa76a
--- /dev/null
+++ b/java/openjdk18/files/patch-src_jdk.management_unix_native_libmanagement__ext_OperatingSystemImpl.c
@@ -0,0 +1,89 @@
+--- src/jdk.management/unix/native/libmanagement_ext/OperatingSystemImpl.c.orig 2022-07-20 22:54:48 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
+
+@@ -178,23 +179,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 */
+ /*
+@@ -404,6 +425,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 dirent* dentp;
diff --git a/java/openjdk18/pkg-message b/java/openjdk18/pkg-message
index fcb6defe8dcd..811dcb1e3b58 100644
--- a/java/openjdk18/pkg-message
+++ b/java/openjdk18/pkg-message
@@ -1,17 +1,15 @@
[
{ type: install
message: <<EOM
-This OpenJDK implementation may require fdescfs(5) mounted on /dev/fd
-and procfs(5) mounted on /proc for some applications.
+This OpenJDK implementation may require procfs(5) mounted on /proc for some
+applications.
If you have not done it yet, please do the following:
- mount -t fdescfs fdesc /dev/fd
mount -t procfs proc /proc
To make it permanent, you need the following lines in /etc/fstab:
- fdesc /dev/fd fdescfs rw 0 0
proc /proc procfs rw 0 0
EOM
}