--- src/jdk.management/unix/native/libmanagement_ext/OperatingSystemImpl.c.orig 2025-01-07 14:27:42 UTC +++ src/jdk.management/unix/native/libmanagement_ext/OperatingSystemImpl.c @@ -32,6 +32,9 @@ #include #include +#if defined(__FreeBSD__) +#include +#endif #if defined(_ALLBSD_SOURCE) #include #ifdef __APPLE__ @@ -178,23 +181,48 @@ Java_com_sun_management_internal_OperatingSystemImpl_g } return t_info.virtual_size; #elif defined(__FreeBSD__) - FILE *fp; - unsigned long end, start; + int mib[4]; + int error; + int cnt; + size_t len; + char *buf, *bp, *eb; jlong total = 0; - if ((fp = fopen("/proc/curproc/map", "r")) == NULL) { - throw_internal_error(env, "Unable to open /proc/curproc/map"); - return -1; + len = 0; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_VMMAP; + mib[3] = getpid(); + + error = sysctl(mib, nitems(mib), NULL, &len, NULL, 0); + if (error) { + throw_internal_error(env, "Unable to open kern.proc.vmmap"); + 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, "Unable to allocate memory"); + return -1; } - fclose(fp); + error = sysctl(mib, nitems(mib), buf, &len, NULL, 0); + if (error) { + free(buf); + throw_internal_error(env, "Unable to allocate memory"); + return -1; + } + bp = buf; + eb = buf + len; + while (bp < eb) { + struct kinfo_vmentry *kv = (struct kinfo_vmentry *)(uintptr_t)bp; + if (kv->kve_structsize == 0) + break; + bp += kv->kve_structsize; + total += kv->kve_end - kv->kve_start; + } + free(buf); return total; #else /* _ALLBSD_SOURCE */ /* @@ -402,6 +430,22 @@ Java_com_sun_management_internal_OperatingSystemImpl_g free(fds); return nfiles; +#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; + #elif defined(__OpenBSD__) return getdtablecount(); #else /* solaris/linux */