Index: c/os_unix_system.c |
diff --git a/c/os_unix_system.c b/c/os_unix_system.c |
deleted file mode 100644 |
index dec3ffa83aa04c16c755ea31a4495483c389b3e3..0000000000000000000000000000000000000000 |
--- a/c/os_unix_system.c |
+++ /dev/null |
@@ -1,451 +0,0 @@ |
-#ifndef _WINDOWS |
- |
-/* Licensed to the Apache Software Foundation (ASF) under one or more |
- * contributor license agreements. See the NOTICE file distributed with |
- * this work for additional information regarding copyright ownership. |
- * The ASF licenses this file to You under the Apache License, Version 2.0 |
- * (the "License"); you may not use this file except in compliance with |
- * the License. You may obtain a copy of the License at |
- * |
- * http://www.apache.org/licenses/LICENSE-2.0 |
- * |
- * Unless required by applicable law or agreed to in writing, software |
- * distributed under the License is distributed on an "AS IS" BASIS, |
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
- * See the License for the specific language governing permissions and |
- * limitations under the License. |
- */ |
- |
-/* |
- * |
- * @author Mladen Turk |
- * @version $Id: system.c 1445974 2013-02-13 23:11:53Z rjung $ |
- */ |
- |
-#include "apr.h" |
-#include "apr_pools.h" |
-#include "apr_network_io.h" |
-#include "apr_poll.h" |
- |
-#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(DARWIN) |
-#include <mach/mach_init.h> |
-#include <mach/mach_host.h> |
-#include <mach/host_info.h> |
-#include <sys/sysctl.h> |
-#include <sys/stat.h> |
-#endif |
- |
-#include <syslog.h> |
-#include <stdarg.h> |
- |
-#ifndef LOG_WARN |
-#define LOG_WARN LOG_WARNING |
-#endif |
- |
-#if defined(sun) |
-#define MAX_PROC_PATH_LEN 64 |
-#define MAX_CPUS 512 |
-#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); |
-} |
- |
-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 0; |
- } |
- else |
- return -1; |
-} |
- |
-#endif |
- |
-TCN_IMPLEMENT_CALL(jboolean, OS, is)(TCN_STDARGS, jint type) |
-{ |
- UNREFERENCED_STDARGS; |
- if (type == 1) |
- return JNI_TRUE; |
-#if defined(__linux__) |
- else if (type == 5) |
- return JNI_TRUE; |
-#endif |
-#if defined(sun) |
- else if (type == 6) |
- return JNI_TRUE; |
-#endif |
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) |
- else if (type == 7) |
- return JNI_TRUE; |
-#endif |
-#if defined(__APPLE__) || defined(DARWIN) |
- else if (type == 8) |
- return JNI_TRUE; |
-#endif |
- else |
- return JNI_FALSE; |
-} |
- |
-TCN_IMPLEMENT_CALL(jint, OS, info)(TCN_STDARGS, |
- jlongArray inf) |
-{ |
- jint rv; |
- int i; |
- jsize ilen = (*e)->GetArrayLength(e, inf); |
- jlong *pvals = (*e)->GetLongArrayElements(e, inf, NULL); |
- |
- UNREFERENCED(o); |
- if (ilen < 16) { |
- return APR_EINVAL; |
- } |
- for (i = 0; i < 16; i++) |
- pvals[i] = 0; |
-#if defined(__linux__) |
- { |
- struct sysinfo info; |
- if (sysinfo(&info)) |
- rv = apr_get_os_error(); |
- else { |
- static char buf[1024]; |
- unsigned long user = 0; |
- unsigned long system = 0; |
- long idle = 0; |
- long long starttime = 0; |
- int fd; |
- int len; |
- long sys_clk_tck = sysconf(_SC_CLK_TCK); /* number of system ticks per second */ |
- |
- pvals[0] = (jlong)(info.totalram * info.mem_unit); |
- pvals[1] = (jlong)(info.freeram * info.mem_unit); |
- pvals[2] = (jlong)(info.totalswap * info.mem_unit); |
- pvals[3] = (jlong)(info.freeswap * info.mem_unit); |
- pvals[4] = (jlong)(info.sharedram * info.mem_unit); |
- pvals[5] = (jlong)(info.bufferram * info.mem_unit); |
- pvals[6] = (jlong)(100 - (info.freeram * 100 / info.totalram)); |
- |
- if (sys_clk_tck >= 0) { |
- /* Get total CPU times from /proc/stat */ |
- /* Example for the first line: cpu 2095497 8176 3280198 908667841 1543576 28867 375399 0 0 */ |
- /* According to the man pages, the numbers are given in units of USER_HZ: |
- * user mode, user mode with low priority (nice), system mode, and the idle task. |
- * Additional values can be ignored. */ |
- fd = open("/proc/stat", O_RDONLY); |
- if (fd != -1) { |
- len = read(fd, buf, sizeof buf - 1); |
- if (len > 0) { |
- buf[len] = '\0'; |
- if (sscanf(buf, "cpu %lu %*d %lu %ld", &user, &system, &idle) == 3) { |
- pvals[7] = (jlong)(idle * 1000 / sys_clk_tck * 1000); /* Idle Time in microseconds */ |
- pvals[8] = (jlong)(system * 1000 / sys_clk_tck * 1000); /* Kernel Time in microseconds */ |
- pvals[9] = (jlong)(user * 1000 / sys_clk_tck * 1000); /* User Time in microseconds */ |
- } |
- } |
- close(fd); |
- } |
- /* Get process CPU times from /proc/self/stat */ |
- /* Example for the first line: |
- * 6309 (csh) S 6308 6309 6309 34816 7124 4202496 15119 252261 1 30 21 58 1537 1447 20 0 1 0 916031966 ... */ |
- /* Parsing it according to man -s 5 proci: |
- * pid %d, comm %s, state %c, ppid %d pgrp %d, session %d, tty_nr %d, tpgid %d, flags %u, |
- * minflt %lu, cminflt %lu, majflt %lu, cmajflt %lu, |
- * utime %lu (!), stime %lu (!), cutime %ld (!), cstime %ld (!), |
- * priority %ld, nice %ld, num_threads %ld, itrealvalue %ld, |
- * starttime %llu (!) */ |
- fd = open("/proc/self/stat", O_RDONLY); |
- if (fd != -1) { |
- len = read(fd, buf, sizeof buf - 1); |
- if (len > 0) { |
- buf[len] = '\0'; |
- if (sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*u" |
- " %*u %*u %*u %*u" |
- " %lu %lu %*d %*d" |
- " %*d %*d %*d %*d" |
- "%llu", &user, &system, &starttime) == 3) { |
- pvals[10] = (jlong)(apr_time_now() - apr_time_make(info.uptime - starttime / sys_clk_tck, 0)); /* Process creation time (apr_time_t) */ |
- pvals[11] = (jlong)(system * 1000 / sys_clk_tck * 1000); /* Process System Time in microseconds */ |
- pvals[12] = (jlong)(user * 1000 / sys_clk_tck * 1000); /* Process User Time in microseconds */ |
- } |
- } |
- close(fd); |
- } |
- } |
- |
- 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 microseconds */ |
- long tck_divisor; /* divisor used by transforming tick numbers to microseconds */ |
- 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)((jlong)sys_pagesize * ret_sysconf); |
- } |
- else { |
- rv = apr_get_os_error(); |
- } |
- ret_sysconf = sysconf(_SC_AVPHYS_PAGES); |
- if (ret_sysconf >= 0) { |
- pvals[1] = (jlong)((jlong)sys_pagesize * ret_sysconf); |
- } |
- else { |
- rv = apr_get_os_error(); |
- } |
- res=swapctl(SC_AINFO, &info); |
- if (res >= 0) { |
- pvals[2] = (jlong)((jlong)sys_pagesize * info.ani_max); |
- pvals[3] = (jlong)((jlong)sys_pagesize * info.ani_free); |
- pvals[6] = (jlong)(100 - (jlong)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 * 1000000L); |
- pvals[11] = (jlong)((jlong)prusg.pr_stime.tv_sec * 1000000L + |
- (prusg.pr_stime.tv_nsec / 1000L)); |
- pvals[12] = (jlong)((jlong)prusg.pr_utime.tv_sec * 1000000L + |
- (prusg.pr_utime.tv_nsec / 1000L)); |
- 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 = 1000000L; |
- 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; |
- if ( tck_divisor == 1 ) { |
- pvals[7] += (jlong)(((jlong)cpu.cpu[CPU_IDLE]) * tck_dividend); |
- pvals[7] += (jlong)(((jlong)cpu.cpu[CPU_WAIT]) * tck_dividend); |
- pvals[8] += (jlong)(((jlong)cpu.cpu[CPU_KERNEL]) * tck_dividend); |
- pvals[9] += (jlong)(((jlong)cpu.cpu[CPU_USER]) * tck_dividend); |
- } else { |
- pvals[7] += (jlong)(((jlong)cpu.cpu[CPU_IDLE]) * tck_dividend / tck_divisor); |
- pvals[7] += (jlong)(((jlong)cpu.cpu[CPU_WAIT]) * tck_dividend / tck_divisor); |
- pvals[8] += (jlong)(((jlong)cpu.cpu[CPU_KERNEL]) * tck_dividend / tck_divisor); |
- pvals[9] += (jlong)(((jlong)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 |
- * |
- */ |
- } |
- |
-#elif defined(DARWIN) |
- |
- uint64_t mem_total; |
- size_t len = sizeof(mem_total); |
- |
- vm_statistics_data_t vm_info; |
- mach_msg_type_number_t info_count = HOST_VM_INFO_COUNT; |
- |
- sysctlbyname("hw.memsize", &mem_total, &len, NULL, 0); |
- pvals[0] = (jlong)mem_total; |
- |
- host_statistics(mach_host_self (), HOST_VM_INFO, (host_info_t)&vm_info, &info_count); |
- pvals[1] = (jlong)(((double)vm_info.free_count)*vm_page_size); |
- pvals[6] = (jlong)(100 - (pvals[1] * 100 / mem_total)); |
- rv = APR_SUCCESS; |
- |
-/* DARWIN */ |
-#else |
- rv = APR_ENOTIMPL; |
-#endif |
- (*e)->ReleaseLongArrayElements(e, inf, pvals, 0); |
- return rv; |
-} |
- |
-#define LOG_MSG_DOMAIN "Native" |
- |
- |
-TCN_IMPLEMENT_CALL(jstring, OS, expand)(TCN_STDARGS, jstring val) |
-{ |
- jstring str; |
- TCN_ALLOC_CSTRING(val); |
- |
- UNREFERENCED(o); |
- |
- /* TODO: Make ${ENVAR} expansion */ |
- str = (*e)->NewStringUTF(e, J2S(val)); |
- |
- TCN_FREE_CSTRING(val); |
- return str; |
-} |
- |
-TCN_IMPLEMENT_CALL(void, OS, sysloginit)(TCN_STDARGS, jstring domain) |
-{ |
- const char *d; |
- TCN_ALLOC_CSTRING(domain); |
- |
- UNREFERENCED(o); |
- if ((d = J2S(domain)) == NULL) |
- d = LOG_MSG_DOMAIN; |
- |
- openlog(d, LOG_CONS | LOG_PID, LOG_LOCAL0); |
- TCN_FREE_CSTRING(domain); |
-} |
- |
-TCN_IMPLEMENT_CALL(void, OS, syslog)(TCN_STDARGS, jint level, |
- jstring msg) |
-{ |
- TCN_ALLOC_CSTRING(msg); |
- int id = LOG_DEBUG; |
- UNREFERENCED(o); |
- |
- switch (level) { |
- case TCN_LOG_EMERG: |
- id = LOG_EMERG; |
- break; |
- case TCN_LOG_ERROR: |
- id = LOG_ERR; |
- break; |
- case TCN_LOG_NOTICE: |
- id = LOG_NOTICE; |
- break; |
- case TCN_LOG_WARN: |
- id = LOG_WARN; |
- break; |
- case TCN_LOG_INFO: |
- id = LOG_INFO; |
- break; |
- } |
- syslog (id, "%s", J2S(msg)); |
- |
- TCN_FREE_CSTRING(msg); |
-} |
- |
-#endif |
- |