diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2011-02-11 00:41:48 +0000 |
---|---|---|
committer | Jung-uk Kim <jkim@FreeBSD.org> | 2011-02-11 00:41:48 +0000 |
commit | 6ac447dee9988b6f7363c15dad9537d3216283f2 (patch) | |
tree | f773aa114c970dc3ca56bc379cb2df926074d800 /java/openjdk6/files/patch-set | |
parent | Update to SVN r608, assorted bug fixes. (diff) |
- Implement some missing FreeBSD-specific methods, i.e., swap info, committed
virtual memory, free physical memory, and number of open file descriptors.
For example, jconsole shows more realistic numbers instead of hardcoded bogus
numbers in VM Summary tab now. Correct a jtreg test case for the swap info.
- Mention procfs(5) is used for some features in this implementation.
Notes
Notes:
svn path=/head/; revision=268901
Diffstat (limited to 'java/openjdk6/files/patch-set')
-rw-r--r-- | java/openjdk6/files/patch-set | 111 |
1 files changed, 85 insertions, 26 deletions
diff --git a/java/openjdk6/files/patch-set b/java/openjdk6/files/patch-set index c06da0870858..8b4cb0066108 100644 --- a/java/openjdk6/files/patch-set +++ b/java/openjdk6/files/patch-set @@ -14954,7 +14954,7 @@ /* Signals */ --- jdk/src/solaris/native/com/sun/management/UnixOperatingSystem_md.c 2011-01-20 18:54:41.000000000 -0500 -+++ jdk/src/solaris/native/com/sun/management/UnixOperatingSystem_md.c 2011-02-01 17:46:56.000000000 -0500 ++++ jdk/src/solaris/native/com/sun/management/UnixOperatingSystem_md.c 2011-02-10 18:31:00.000000000 -0500 @@ -32,10 +32,16 @@ #include <sys/types.h> @@ -14972,7 +14972,13 @@ #include <ctype.h> #include <dirent.h> #include <errno.h> -@@ -46,16 +52,22 @@ +@@ -43,19 +49,28 @@ + #include <limits.h> + #include <stdlib.h> + #include <unistd.h> ++#if defined(__FreeBSD__) ++#include <vm/vm_param.h> ++#endif static jlong page_size = 0; @@ -14996,7 +15002,7 @@ struct dirent* p; if (readdir_r(dirp, entry, &p) == 0) { return p; -@@ -124,7 +136,7 @@ +@@ -124,7 +139,7 @@ free(strtab); return available ? ((jlong)avail * page_size) : ((jlong)total * page_size); @@ -15005,21 +15011,36 @@ int ret; FILE *fp; jlong total = 0, avail = 0; -@@ -138,6 +150,13 @@ +@@ -138,6 +153,28 @@ avail = (jlong)si.freeswap * si.mem_unit; return available ? avail : total; ++#elif defined(__FreeBSD__) ++ struct xswdev xsw; ++ size_t mibsize, size; ++ jlong npages; ++ int mib[16], n; ++ ++ mibsize = sizeof(mib) / sizeof(mib[0]); ++ if (sysctlnametomib("vm.swap_info", mib, &mibsize) == -1) ++ return (0); ++ for (n = 0, npages = 0; ; n++) { ++ mib[mibsize] = n; ++ size = sizeof(xsw); ++ if (sysctl(mib, mibsize + 1, &xsw, &size, NULL, 0) == -1) ++ break; ++ npages += xsw.xsw_nblks; ++ if (available) ++ npages -= xsw.xsw_used; ++ } ++ return (npages * page_size); +#else /* _ALLBSD_SOURCE */ -+ /* -+ * XXXBSD: there's no way available to get swap info in -+ * FreeBSD. Usage of libkvm is not an option here -+ */ -+ // throw_internal_error(env, "Unimplemented in FreeBSD"); ++ // throw_internal_error(env, "Unimplemented in BSD"); + return (0); #endif } -@@ -179,7 +198,7 @@ +@@ -179,7 +216,7 @@ JVM_Close(fd); return (jlong) psinfo.pr_size * 1024; @@ -15028,20 +15049,39 @@ FILE *fp; unsigned long vsize = 0; -@@ -197,6 +216,12 @@ +@@ -197,6 +234,31 @@ fclose(fp); return (jlong)vsize; ++#elif defined(__FreeBSD__) ++ FILE *fp; ++ unsigned long end, start; ++ jlong total = 0; ++ ++ if ((fp = fopen("/proc/curproc/map", "r")) == NULL) { ++ throw_internal_error(env, "Unable to open /proc/curproc/map"); ++ 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; ++ } ++ ++ fclose(fp); ++ return total; +#else /* _ALLBSD_SOURCE */ + /* -+ * XXXBSD: there's no way available to do it in FreeBSD, AFAIK. ++ * XXXBSD: there's no way available to get vsize in BSD. + */ -+ // throw_internal_error(env, "Unimplemented in FreeBSD"); ++ // throw_internal_error(env, "Unimplemented in BSD"); + return (64 * MB); #endif } -@@ -222,9 +247,13 @@ +@@ -222,9 +284,13 @@ jlong cpu_time_ns; struct tms time; @@ -15057,15 +15097,19 @@ clk_tck = 100; #endif if (clk_tck == -1) { -@@ -244,22 +273,51 @@ +@@ -244,32 +310,70 @@ Java_com_sun_management_UnixOperatingSystem_getFreePhysicalMemorySize (JNIEnv *env, jobject mbean) { -+#ifdef _ALLBSD_SOURCE -+ /* -+ * XXXBSD: there's no way available to do it in FreeBSD, AFAIK. -+ */ -+ // throw_internal_error(env, "Unimplemented in FreeBSD"); ++#if defined (__FreeBSD__) ++ int npages; ++ size_t size; ++ size = sizeof(npages); ++ if (sysctlbyname("vm.stats.vm.v_free_count", &npages, &size, NULL, 0) == - 1) ++ return (0); ++ return ((jlong)npages * page_size); ++#elif defined(_ALLBSD_SOURCE) ++ // throw_internal_error(env, "Unimplemented in BSD"); + return (128 * MB); +#else jlong num_avail_physical_pages = sysconf(_SC_AVPHYS_PAGES); @@ -15099,17 +15143,32 @@ Java_com_sun_management_UnixOperatingSystem_getOpenFileDescriptorCount (JNIEnv *env, jobject mbean) { -+#ifdef _ALLBSD_SOURCE -+ /* -+ * XXXBSD: there's no way available to do it in FreeBSD, AFAIK. -+ */ -+ // throw_internal_error(env, "Unimplemented in FreeBSD"); ++#if defined(_ALLBSD_SOURCE) && !defined(__FreeBSD__) ++ // throw_internal_error(env, "Unimplemented in BSD"); + return (100); +#else /* solaris/linux */ DIR *dirp; struct dirent dbuf; struct dirent* dentp; -@@ -282,6 +340,7 @@ + jlong fds = 0; + ++#if defined(__FreeBSD__) ++ dirp = opendir("/dev/fd"); ++ if (dirp == NULL) { ++ throw_internal_error(env, "Unable to open directory /dev/fd"); ++ return -1; ++ } ++#else + dirp = opendir("/proc/self/fd"); + if (dirp == NULL) { + throw_internal_error(env, "Unable to open directory /proc/self/fd"); + return -1; + } ++#endif + + // iterate through directory entries, skipping '.' and '..' + // each entry represents an open file descriptor. +@@ -282,6 +386,7 @@ closedir(dirp); // subtract by 1 which was the fd open for this implementation return (fds - 1); |