mturk 2005/07/31 23:34:33
Modified: jni/java/org/apache/tomcat/jni OS.java
jni/native/os/unix system.c
jni/native/os/win32 system.c
Log:
Implement Solaris system info. Patches provided by Rainer Jung.
Revision Changes Path
1.8 +2 -2
jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/OS.java
Index: OS.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/OS.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- OS.java 12 Jul 2005 14:56:09 -0000 1.7
+++ OS.java 1 Aug 2005 06:34:32 -0000 1.8
@@ -91,7 +91,7 @@
* inf[6] - Memory Load
*
* inf[7] - Idle Time in microseconds
- * inf[9] - Kernel Time in microseconds
+ * inf[8] - Kernel Time in microseconds
* inf[9] - User Time in microseconds
*
* inf[10] - Process creation time (apr_time_t)
1.9 +189 -1 jakarta-tomcat-connectors/jni/native/os/unix/system.c
Index: system.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/os/unix/system.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- system.c 12 Jul 2005 14:56:11 -0000 1.8
+++ system.c 1 Aug 2005 06:34:33 -0000 1.9
@@ -27,6 +27,42 @@
#include "tcn.h"
#if defined(__linux__)
#include <sys/sysinfo.h>
+#elif defined(sun)
+#include <unistd.h>
+#include <sys/swap.h>
+#include <procfs.h>
+#include <kstat.h>
+#include <sys/sysinfo.h>
+#endif
+
+#if defined(sun)
+#define MAX_PROC_PATH_LEN 64
+#define MAX_CPUS 512
+// #define PSTATUS_T_SZ sizeof(pstatus_t)
+#define PSINFO_T_SZ sizeof(psinfo_t)
+#define PRUSAGE_T_SZ sizeof(prusage_t)
+
+static int proc_open(const char *type) {
+ char proc_path[MAX_PROC_PATH_LEN+1];
+
+ sprintf(proc_path,"/proc/self/%s",type);
+ return open(proc_path, O_RDONLY);
+} // end proc_open
+
+static int proc_read(void *buf, const size_t size, int filedes) {
+ ssize_t bytes;
+
+ if ( filedes >= 0 ) {
+ bytes = pread(filedes, buf, size, 0);
+ if ( bytes != size ) {
+ return -1;
+ }
+ } else {
+ return -1;
+ }
+ return 0;
+} // end proc_read
+
#endif
TCN_IMPLEMENT_CALL(jboolean, OS, is)(TCN_STDARGS, jint type)
@@ -80,6 +116,158 @@
rv = APR_SUCCESS;
}
}
+#elif defined(sun)
+ {
+/* static variables with basic procfs info */
+ static long creation = 0; /* unix timestamp of process
creation */
+ static int psinf_fd = 0; /* file descriptor for the
psinfo procfs file */
+ static int prusg_fd = 0; /* file descriptor for the
usage procfs file */
+ static size_t rss=0; /* maximum of resident set
size from previous calls */
+/* static variables with basic kstat info */
+ static kstat_ctl_t *kstat_ctl = NULL; /* kstat control object, only
initialized once */
+ static kstat_t *kstat_cpu[MAX_CPUS]; /* array of kstat objects for
per cpu statistics */
+ static int cpu_count=0; /* number of cpu structures
found in kstat */
+ static kid_t kid=0; /* kstat ID, for which the
kstat_ctl holds the correct chain */
+/* non-static variables - general use */
+ int res=0; /* general result state */
+/* non-static variables - sysinfo/swapctl use */
+ long ret_sysconf; /* value returned from
sysconf call */
+ long tck_dividend; /* factor used by
transforming tick numbers to milliseconds */
+ long tck_divisor; /* divisor used by
transforming tick numbers to milliseconds */
+ long sys_pagesize=sysconf(_SC_PAGESIZE); /* size of a system memory
page in bytes */
+ long sys_clk_tck=sysconf(_SC_CLK_TCK); /* number of system ticks per
second */
+ struct anoninfo info; /* structure for information
about sizes in anonymous memory system */
+/* non-static variables - procfs use */
+ psinfo_t psinf; /* psinfo structure from
procfs */
+ prusage_t prusg; /* usage structure from
procfs */
+ size_t new_rss=0; /* resident set size read
from procfs */
+ time_t now; /* time needed for
calculating process creation time */
+/* non-static variables - kstat use */
+ kstat_t *kstat = NULL; /* kstat working pointer */
+ cpu_sysinfo_t cpu; /* cpu sysinfo working
pointer */
+ kid_t new_kid=0; /* kstat ID returned from
chain update */
+ int new_kstat=0; /* flag indicating, if kstat
structure has changed since last call */
+
+ rv = APR_SUCCESS;
+
+ if ( sys_pagesize <= 0 ) {
+ rv = apr_get_os_error();
+ } else {
+ ret_sysconf=sysconf(_SC_PHYS_PAGES);
+ if ( ret_sysconf >= 0 ) {
+ pvals[0] = (jlong)(sys_pagesize*ret_sysconf);
+ } else {
+ rv = apr_get_os_error();
+ }
+ ret_sysconf=sysconf(_SC_AVPHYS_PAGES);
+ if ( ret_sysconf >= 0 ) {
+ pvals[1] = (jlong)(sys_pagesize*ret_sysconf);
+ } else {
+ rv = apr_get_os_error();
+ }
+ res=swapctl(SC_AINFO, &info);
+ if ( res >= 0 ) {
+ pvals[2] = (jlong)(sys_pagesize*info.ani_max);
+ pvals[3] = (jlong)(sys_pagesize*info.ani_free);
+ pvals[6] = (jlong)(100 - (info.ani_free * 100 /
info.ani_max));
+ } else {
+ rv = apr_get_os_error();
+ }
+ }
+
+ if ( psinf_fd == 0 ) {
+ psinf_fd = proc_open("psinfo");
+ }
+ res = proc_read(&psinf, PSINFO_T_SZ, psinf_fd);
+ if ( res >= 0 ) {
+ new_rss = psinf.pr_rssize*1024;
+ pvals[13] = (jlong)(new_rss);
+ if ( new_rss > rss ) {
+ rss = new_rss;
+ }
+ pvals[14] = (jlong)(rss);
+ } else {
+ psinf_fd = 0;
+ rv = apr_get_os_error();
+ }
+ if ( prusg_fd == 0 ) {
+ prusg_fd = proc_open("usage");
+ }
+ res = proc_read(&prusg, PRUSAGE_T_SZ, prusg_fd);
+ if ( res >= 0 ) {
+ if ( creation <= 0 ) {
+ time(&now);
+ creation =
(long)(now-(prusg.pr_tstamp.tv_sec-prusg.pr_create.tv_sec));
+ }
+ pvals[10] = (jlong)(creation);
+ pvals[11] =
(jlong)(prusg.pr_stime.tv_sec*1000+(prusg.pr_stime.tv_nsec/1000000));
+ pvals[12] =
(jlong)(prusg.pr_utime.tv_sec*1000+(prusg.pr_utime.tv_nsec/1000000));
+ pvals[15] = (jlong)(prusg.pr_majf);
+ } else {
+ prusg_fd = 0;
+ rv = apr_get_os_error();
+ }
+
+ if ( sys_clk_tck <= 0 ) {
+ rv = apr_get_os_error();
+ } else {
+ tck_dividend = 1000;
+ tck_divisor = sys_clk_tck;
+ for (i = 0; i < 3; i++) {
+ if ( tck_divisor % 2 == 0 ) {
+ tck_divisor=tck_divisor/2;
+ tck_dividend=tck_dividend/2;
+ }
+ if ( tck_divisor % 5 == 0 ) {
+ tck_divisor=tck_divisor/5;
+ tck_dividend=tck_dividend/5;
+ }
+ }
+ if ( kstat_ctl == NULL ) {
+ kstat_ctl = kstat_open();
+ kid = kstat_ctl->kc_chain_id;
+ new_kstat=1;
+ } else {
+ new_kid = kstat_chain_update(kstat_ctl);
+ if ( new_kid < 0 ) {
+ res=kstat_close(kstat_ctl);
+ kstat_ctl = kstat_open();
+ kid = kstat_ctl->kc_chain_id;
+ new_kstat=1;
+ } else if ( new_kid > 0 && kid != new_kid ) {
+ kid = new_kid;
+ new_kstat=1;
+ }
+ }
+ if ( new_kstat ) {
+ cpu_count=0;
+ for (kstat = kstat_ctl->kc_chain; kstat; kstat =
kstat->ks_next) {
+ if (strncmp(kstat->ks_name, "cpu_stat", 8) == 0 ) {
+ kstat_cpu[cpu_count++]=kstat;
+ }
+ }
+ }
+ for (i=0;i<cpu_count;i++) {
+ new_kid = kstat_read(kstat_ctl, kstat_cpu[i], NULL);
+ if ( new_kid >= 0 ) {
+ cpu = ((cpu_stat_t *)kstat_cpu[i]->ks_data)->cpu_sysinfo;
+ pvals[7] +=
(jlong)(((long)cpu.cpu[CPU_IDLE])*tck_dividend/tck_divisor);
+ pvals[7] +=
(jlong)(((long)cpu.cpu[CPU_WAIT])*tck_dividend/tck_divisor);
+ pvals[8] +=
(jlong)(((long)cpu.cpu[CPU_KERNEL])*tck_dividend/tck_divisor);
+ pvals[9] +=
(jlong)(((long)cpu.cpu[CPU_USER])*tck_dividend/tck_divisor);
+ }
+ }
+ }
+
+/*
+ * The next two are not implemented yet for Solaris
+ * inf[4] - Amount of shared memory
+ * inf[5] - Memory used by buffers
+ *
+ */
+ pvals[4] = (jlong)0;
+ pvals[5] = (jlong)0;
+ }
#else
rv = APR_ENOTIMPL;
#endif
1.9 +2 -2 jakarta-tomcat-connectors/jni/native/os/win32/system.c
Index: system.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jni/native/os/win32/system.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- system.c 12 Jul 2005 14:56:11 -0000 1.8
+++ system.c 1 Aug 2005 06:34:33 -0000 1.9
@@ -205,7 +205,7 @@
pvals[12] = st[2];
if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) {
- pvals[14] = pmc.WorkingSetSize;
+ pvals[13] = pmc.WorkingSetSize;
pvals[14] = pmc.PeakWorkingSetSize;
pvals[15] = pmc.PageFaultCount;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]