102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar netcpu_sysctl_id[]="\ 202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netcpu_osx.c Version 2.4.3"; 302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_CONFIG_H 502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <config.h> 602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h> 902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_INTTYPES_H 1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <inttypes.h> 1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else 1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDINT_H 1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stdint.h> 1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif 1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if TIME_WITH_SYS_TIME 1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/time.h> 2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <time.h> 2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else 2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_SYS_TIME_H 2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/time.h> 2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# else 2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <time.h> 2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif 2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_LIMITS_H 2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <limits.h> 3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# ifndef LONG_LONG_MAX 3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# define LONG_LONG_MAX LLONG_MAX 3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif /* LONG_LONG_MAX */ 3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif 3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h> 3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <mach/host_info.h> 3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <mach/mach_types.h> 4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* it would seem that on 10.3.9 mach_msg_type_number_t is in 4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project <mach/message.h> so we'll see about including that one too. 4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project hopefully it still exists in 10.4. if not, we will need to add some 4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project .h file checks in configure so we can use "HAVE_mumble" ifdefs 4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project here */ 4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <mach/message.h> 4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h" 4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h" 4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define UNSIGNED_DIFFERENCE(x,y) (x >= y ? x - y : (0 - y) + x ) 5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic host_cpu_load_info_data_t lib_start_ticks; 5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic host_cpu_load_info_data_t lib_end_ticks; 5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic mach_port_t lib_host_port; 5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_init(void) 5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_host_port = mach_host_self(); 6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_terminate(void) 6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project mach_port_deallocate(lib_host_port); 6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint 7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_method(void) 7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return OSX; 7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_idle(uint64_t *res) 7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_host_ticks(host_cpu_load_info_t info) 8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project mach_msg_type_number_t count; 8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project count = HOST_CPU_LOAD_INFO_COUNT; 8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project host_statistics(lib_host_port, HOST_CPU_LOAD_INFO, (host_info_t)info, &count); 9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return; 9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* calibrate_sysctl - perform the idle rate calculation using the 9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project sysctl call - typically on BSD */ 9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat 9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_idle_rate(int iterations, int interval) 9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return (float)0.0; 10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat 10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util_internal(float elapsed_time) 10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project float correction_factor; 10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project natural_t userticks, systicks, idleticks, totalticks; 10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util = (float)0.0; 10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* It is possible that the library measured a time other than */ 11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* the one that the user want for the cpu utilization */ 11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* calculations - for example, tests that were ended by */ 11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* watchdog timers such as the udp stream test. We let these */ 11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* tests tell up what the elapsed time should be. */ 11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (elapsed_time != 0.0) { 11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project correction_factor = (float) 1.0 + 11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project ((lib_elapsed - elapsed_time) / elapsed_time); 11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project else { 12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project correction_factor = (float) 1.0; 12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project if (debug) { 12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project fprintf(where, "correction factor: %f\n", correction_factor); 12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project } 12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project userticks = UNSIGNED_DIFFERENCE((lib_end_ticks.cpu_ticks[CPU_STATE_USER] + lib_end_ticks.cpu_ticks[CPU_STATE_NICE]), 12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project (lib_start_ticks.cpu_ticks[CPU_STATE_USER] + lib_start_ticks.cpu_ticks[CPU_STATE_NICE])); 12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project systicks = UNSIGNED_DIFFERENCE(lib_end_ticks.cpu_ticks[CPU_STATE_SYSTEM], lib_start_ticks.cpu_ticks[CPU_STATE_SYSTEM]); 13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project idleticks = UNSIGNED_DIFFERENCE(lib_end_ticks.cpu_ticks[CPU_STATE_IDLE], lib_start_ticks.cpu_ticks[CPU_STATE_IDLE]); 13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project totalticks = userticks + systicks + idleticks; 13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util = ((float)userticks + (float)systicks)/(float)totalticks * 100.0f; 13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project lib_local_cpu_util *= correction_factor; 13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project return lib_local_cpu_util; 13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void) 14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project get_host_ticks(&lib_start_ticks); 14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project 14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid 14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void) 14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{ 14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project get_host_ticks(&lib_end_ticks); 14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} 150