| char netcpu_sysctl_id[]="\ |
| @(#)netcpu_osx.c Version 2.4.3"; |
| |
| #if HAVE_CONFIG_H |
| # include <config.h> |
| #endif |
| |
| #include <stdio.h> |
| |
| #if HAVE_INTTYPES_H |
| # include <inttypes.h> |
| #else |
| # if HAVE_STDINT_H |
| # include <stdint.h> |
| # endif |
| #endif |
| |
| #if TIME_WITH_SYS_TIME |
| # include <sys/time.h> |
| # include <time.h> |
| #else |
| # if HAVE_SYS_TIME_H |
| # include <sys/time.h> |
| # else |
| # include <time.h> |
| # endif |
| #endif |
| #if HAVE_LIMITS_H |
| # include <limits.h> |
| # ifndef LONG_LONG_MAX |
| # define LONG_LONG_MAX LLONG_MAX |
| # endif /* LONG_LONG_MAX */ |
| #endif |
| |
| |
| #include <errno.h> |
| |
| #include <mach/host_info.h> |
| #include <mach/mach_types.h> |
| /* it would seem that on 10.3.9 mach_msg_type_number_t is in |
| <mach/message.h> so we'll see about including that one too. |
| hopefully it still exists in 10.4. if not, we will need to add some |
| .h file checks in configure so we can use "HAVE_mumble" ifdefs |
| here */ |
| #include <mach/message.h> |
| |
| #include "netsh.h" |
| #include "netlib.h" |
| |
| #define UNSIGNED_DIFFERENCE(x,y) (x >= y ? x - y : (0 - y) + x ) |
| |
| static host_cpu_load_info_data_t lib_start_ticks; |
| static host_cpu_load_info_data_t lib_end_ticks; |
| |
| static mach_port_t lib_host_port; |
| |
| void |
| cpu_util_init(void) |
| { |
| lib_host_port = mach_host_self(); |
| return; |
| } |
| |
| void |
| cpu_util_terminate(void) |
| { |
| mach_port_deallocate(lib_host_port); |
| return; |
| } |
| |
| int |
| get_cpu_method(void) |
| { |
| return OSX; |
| } |
| |
| void |
| get_cpu_idle(uint64_t *res) |
| { |
| return; |
| } |
| |
| void |
| get_host_ticks(host_cpu_load_info_t info) |
| { |
| mach_msg_type_number_t count; |
| |
| count = HOST_CPU_LOAD_INFO_COUNT; |
| host_statistics(lib_host_port, HOST_CPU_LOAD_INFO, (host_info_t)info, &count); |
| return; |
| } |
| |
| /* calibrate_sysctl - perform the idle rate calculation using the |
| sysctl call - typically on BSD */ |
| |
| float |
| calibrate_idle_rate(int iterations, int interval) |
| { |
| return (float)0.0; |
| } |
| |
| float |
| calc_cpu_util_internal(float elapsed_time) |
| { |
| float correction_factor; |
| natural_t userticks, systicks, idleticks, totalticks; |
| |
| lib_local_cpu_util = (float)0.0; |
| /* It is possible that the library measured a time other than */ |
| /* the one that the user want for the cpu utilization */ |
| /* calculations - for example, tests that were ended by */ |
| /* watchdog timers such as the udp stream test. We let these */ |
| /* tests tell up what the elapsed time should be. */ |
| |
| if (elapsed_time != 0.0) { |
| correction_factor = (float) 1.0 + |
| ((lib_elapsed - elapsed_time) / elapsed_time); |
| } |
| else { |
| correction_factor = (float) 1.0; |
| } |
| |
| if (debug) { |
| fprintf(where, "correction factor: %f\n", correction_factor); |
| } |
| |
| userticks = UNSIGNED_DIFFERENCE((lib_end_ticks.cpu_ticks[CPU_STATE_USER] + lib_end_ticks.cpu_ticks[CPU_STATE_NICE]), |
| (lib_start_ticks.cpu_ticks[CPU_STATE_USER] + lib_start_ticks.cpu_ticks[CPU_STATE_NICE])); |
| systicks = UNSIGNED_DIFFERENCE(lib_end_ticks.cpu_ticks[CPU_STATE_SYSTEM], lib_start_ticks.cpu_ticks[CPU_STATE_SYSTEM]); |
| idleticks = UNSIGNED_DIFFERENCE(lib_end_ticks.cpu_ticks[CPU_STATE_IDLE], lib_start_ticks.cpu_ticks[CPU_STATE_IDLE]); |
| totalticks = userticks + systicks + idleticks; |
| |
| lib_local_cpu_util = ((float)userticks + (float)systicks)/(float)totalticks * 100.0f; |
| lib_local_cpu_util *= correction_factor; |
| |
| return lib_local_cpu_util; |
| |
| } |
| void |
| cpu_start_internal(void) |
| { |
| get_host_ticks(&lib_start_ticks); |
| } |
| |
| void |
| cpu_stop_internal(void) |
| { |
| get_host_ticks(&lib_end_ticks); |
| } |