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