diff options
author | Baptiste Daroussin <bapt@FreeBSD.org> | 2025-06-27 16:59:37 +0200 |
---|---|---|
committer | Baptiste Daroussin <bapt@FreeBSD.org> | 2025-06-27 17:14:08 +0200 |
commit | 3a407ba074c037ab429e357307016648b4d5ed33 (patch) | |
tree | 37dd87a406495866fc7e1b806e1fe3be672ad104 /java/openjdk18 | |
parent | www/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/Makefile | 2 | ||||
-rw-r--r-- | java/openjdk18/files/patch-src_jdk.management_unix_native_libmanagement__ext_OperatingSystemImpl.c | 89 | ||||
-rw-r--r-- | java/openjdk18/pkg-message | 6 |
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 } |