102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar   netcpu_looper_id[]="\
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netcpu_looper.c (c) Copyright 2005-2007. Version 2.4.3";
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* netcpu_looper.c
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   Implement the soaker process specific portions of netperf CPU
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   utilization measurements. These are broken-out into a separate file
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   to make life much nicer over in netlib.c which had become a maze of
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   twisty, CPU-util-related, #ifdefs, all different.  raj 2005-01-26
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   */
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_CONFIG_H
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <config.h>
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_FCNTL_H
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <fcntl.h>
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_UNISTD_H
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <unistd.h>
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(HAVE_MMAP) || defined(HAVE_SYS_MMAN_H)
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/mman.h>
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# error netcpu_looper requires mmap
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if TIME_WITH_SYS_TIME
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/time.h>
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <time.h>
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_SYS_TIME_H
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <sys/time.h>
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# else
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <time.h>
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_SYS_TYPES_H
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/types.h>
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_SYS_WAIT_H
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/wait.h>
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_SIGNAL_H
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <signal.h>
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef HAVE_ERRNO_H
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h>
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define PAGES_PER_CHILD 2
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* the lib_start_count and lib_end_count arrays hold the starting
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   and ending values of whatever is counting when the system is
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   idle. The rate at which this increments during a test is compared
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   with a previous calibrarion to arrive at a CPU utilization
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   percentage. raj 2005-01-26 */
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic uint64_t  lib_start_count[MAXCPUS];
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic uint64_t  lib_end_count[MAXCPUS];
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int *cpu_mappings;
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int lib_idle_fd;
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic uint64_t *lib_idle_address[MAXCPUS];
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic long     *lib_base_pointer;
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic pid_t     lib_idle_pids[MAXCPUS];
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic int       lib_loopers_running=0;
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* we used to use this code to bind the loopers, but since we have
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   decided to enable processor affinity for the actual
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   netperf/netserver processes we will use that affinity routine,
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   which happens to know about more systems than this */
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef NOTDEF
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectbind_to_processor(int child_num)
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* This routine will bind the calling process to a particular */
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* processor. We are not choosy as to which processor, so it will be */
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the process id mod the number of processors - shifted by one for */
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* those systems which name processor starting from one instead of */
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* zero. on those systems where I do not yet know how to bind a */
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* process to a processor, this routine will be a no-op raj 10/95 */
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* just as a reminder, this is *only* for the looper processes, not */
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the actual measurement processes. those will, should, MUST float */
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* or not float from CPU to CPU as controlled by the operating */
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* system defaults. raj 12/95 */
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __hpux
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/syscall.h>
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/mp.h>
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int old_cpu = -2;
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "child %d asking for CPU %d as pid %d with %d CPUs\n",
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            child_num,
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            (child_num % lib_num_loc_cpus),
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            getpid(),
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            lib_num_loc_cpus);
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  SETPROCESS((child_num % lib_num_loc_cpus), getpid());
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(__sun) && defined(__SVR4)
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* should only be Solaris */
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/processor.h>
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/procset.h>
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int old_binding;
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "bind_to_processor: child %d asking for CPU %d as pid %d with %d CPUs\n",
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            child_num,
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            (child_num % lib_num_loc_cpus),
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            getpid(),
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            lib_num_loc_cpus);
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (processor_bind(P_PID,
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     getpid(),
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                     (child_num % lib_num_loc_cpus),
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                      &old_binding) != 0) {
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"bind_to_processor: unable to perform processor binding\n");
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"                   errno %d\n",errno);
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!SetThreadAffinityMask(GetCurrentThread(), (ULONG_PTR)1 << (child_num % lib_num_loc_cpus))) {
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    perror("SetThreadAffinityMask failed");
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(stderr);
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "bind_to_processor: child %d asking for CPU %d of %d CPUs\n",
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            child_num,
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            (child_num % lib_num_loc_cpus),
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            lib_num_loc_cpus);
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __sun && _SVR4 */
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __hpux */
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* sit_and_spin will just spin about incrementing a value */
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this value will either be in a memory mapped region on Unix shared */
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* by each looper process, or something appropriate on Windows/NT */
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* (malloc'd or such). This routine is reasonably ugly in that it has */
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* priority manipulating code for lots of different operating */
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* systems. This routine never returns. raj 1/96 */
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectsit_and_spin(int child_index)
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t *my_counter_ptr;
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* only use C stuff if we are not WIN32 unless and until we */
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* switch from CreateThread to _beginthread. raj 1/96 */
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are the child. we could decide to exec some separate */
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* program, but that doesn't really seem worthwhile - raj 4/95 */
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "Looper child %d is born, pid %d\n",
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            child_index,
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            getpid());
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reset our base pointer to be at the appropriate offset */
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  my_counter_ptr = (uint64_t *) ((char *)lib_base_pointer +
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                             (netlib_get_page_size() *
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                              PAGES_PER_CHILD * child_index));
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* in the event we are running on an MP system, it would */
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* probably be good to bind the soaker processes to specific */
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* processors. I *think* this is the most reasonable thing to */
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* do, and would be closes to simulating the information we get */
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* on HP-UX with pstat. I could put all the system-specific code */
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* here, but will "abstract it into another routine to keep this */
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* area more readable. I'll probably do the same thine with the */
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* "low pri code" raj 10/95 */
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* since we are "flying blind" wrt where we should bind the looper
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     processes, we want to use the cpu_map that was prepared by netlib
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     rather than assume that the CPU ids on the system start at zero
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     and are contiguous. raj 2006-04-03 */
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  bind_to_specific_processor(child_index % lib_num_loc_cpus,1);
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (*my_counter_ptr = 0L;
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       ;
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       (*my_counter_ptr)++) {
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (!(*lib_base_pointer % 1)) {
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* every once and again, make sure that our process priority is */
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* nice and low. also, by making system calls, it may be easier */
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* for us to be pre-empted by something that needs to do useful */
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* work - like the thread of execution actually sending and */
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* receiving data across the network :) */
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef _AIX
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int pid,prio;
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      prio = PRIORITY;
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      pid = getpid();
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* if you are not root, this call will return EPERM - why one */
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* cannot change one's own priority to  lower value is beyond */
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* me. raj 2/26/96 */
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      setpri(pid, prio);
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* _AIX */
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef __sgi
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      int pid,prio;
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      prio = PRIORITY;
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      pid = getpid();
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      schedctl(NDPRI, pid, prio);
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sginap(0);
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* __sgi */
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_IDLE);
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* WIN32 */
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if defined(__sun) && defined(__SVR4)
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/types.h>
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/priocntl.h>
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/rtpriocntl.h>
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/tspriocntl.h>
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* I would *really* like to know how to use priocntl to make the */
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* priority low for this looper process. however, either my mind */
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* is addled, or the manpage in section two for priocntl is not */
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* terribly helpful - for one, it has no examples :( so, if you */
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* can help, I'd love to hear from you. in the meantime, we will */
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* rely on nice(39). raj 2/26/96 */
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nice(39);
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else /* __sun && __SVR4 */
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      nice(39);
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __sun && _SVR4 */
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* __sgi */
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* _AIX */
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* this routine will start all the looper processes or threads for */
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* measuring CPU utilization. */
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstart_looper_processes()
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned int      i, file_size;
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want at least two pages for each processor. the */
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* child for any one processor will write to the first of his two */
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* pages, and the second page will be a buffer in case there is page */
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* prefetching. if your system pre-fetches more than a single page, */
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* well, you'll have to modify this or live with it :( raj 4/95 */
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  file_size = ((netlib_get_page_size() * PAGES_PER_CHILD) *
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project               lib_num_loc_cpus);
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef WIN32
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we we are not using WINDOWS NT (or 95 actually :), then we want */
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* to create a memory mapped region so we can see all the counting */
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* rates of the loopers */
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* could we just use an anonymous memory region for this? it is */
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* possible that using a mmap()'ed "real" file, while convenient for */
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* debugging, could result in some filesystem activity - like */
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* metadata updates? raj 4/96 */
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_idle_fd = open("/tmp/netperf_cpu",O_RDWR | O_CREAT | O_EXCL);
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (lib_idle_fd == -1) {
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"create_looper: file creation; errno %d\n",errno);
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (chmod("/tmp/netperf_cpu",0644) == -1) {
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"create_looper: chmod; errno %d\n",errno);
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* with the file descriptor in place, lets be sure that the file is */
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* large enough. */
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (truncate("/tmp/netperf_cpu",file_size) == -1) {
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"create_looper: truncate: errno %d\n",errno);
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the file should be large enough now, so we can mmap it */
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* if the system does not have MAP_VARIABLE, just define it to */
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* be zero. it is only used/needed on HP-UX (?) raj 4/95 */
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef MAP_VARIABLE
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define MAP_VARIABLE 0x0000
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* MAP_VARIABLE */
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifndef MAP_FILE
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define MAP_FILE 0x0000
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* MAP_FILE */
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((lib_base_pointer = (long *)mmap(NULL,
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                       file_size,
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                       PROT_READ | PROT_WRITE,
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                       MAP_FILE | MAP_SHARED | MAP_VARIABLE,
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                       lib_idle_fd,
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                       0)) == (long *)-1) {
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"create_looper: mmap: errno %d\n",errno);
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug > 1) {
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"num CPUs %d, file_size %d, lib_base_pointer %p\n",
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            lib_num_loc_cpus,
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            file_size,
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            lib_base_pointer);
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we should have a valid base pointer. lets fork */
35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < (unsigned int)lib_num_loc_cpus; i++) {
35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    switch (lib_idle_pids[i] = fork()) {
35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case -1:
35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      perror("netperf: fork");
35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    case 0:
36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we are the child. we could decide to exec some separate */
36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* program, but that doesn't really seem worthwhile - raj 4/95 */
36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      signal(SIGTERM, SIG_DFL);
36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      sit_and_spin(i);
36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we should never really get here, but if we do, just exit(0) */
36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(0);
36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      break;
36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    default:
37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we must be the parent */
37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lib_idle_address[i] = (uint64_t *) ((char *)lib_base_pointer +
37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                      (netlib_get_page_size() *
37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                       PAGES_PER_CHILD * i));
37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (debug) {
37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"lib_idle_address[%d] is %p\n",
37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                i,
37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                lib_idle_address[i]);
37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we are compiled -DWIN32 */
38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((lib_base_pointer = malloc(file_size)) == NULL) {
38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "create_looper_process could not malloc %d bytes\n",
38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            file_size);
38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(1);
39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now, create all the threads */
39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for(i = 0; i < (unsigned int)lib_num_loc_cpus; i++) {
39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    long place_holder;
39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((lib_idle_pids[i] = CreateThread(0,
39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                         0,
39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                         (LPTHREAD_START_ROUTINE)sit_and_spin,
39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                         (LPVOID)(ULONG_PTR)i,
39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                         0,
40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                         &place_holder)) == NULL ) {
40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "create_looper_process: CreateThread failed\n");
40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* I wonder if I need to look for other threads to kill? */
40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(1);
40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_idle_address[i] = (long *) ((char *)lib_base_pointer +
40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                    (netlib_get_page_size() *
40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                     PAGES_PER_CHILD * i));
41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"lib_idle_address[%d] is %p\n",
41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              i,
41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              lib_idle_address[i]);
41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif /* WIN32 */
41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we need to have the looper processes settled-in before we do */
42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* anything with them, so lets sleep for say 30 seconds. raj 4/95 */
42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  sleep(30);
42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_init(void)
42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  cpu_method = LOOPER;
42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want to get the looper processes going */
43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (!lib_loopers_running) {
43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    start_looper_processes();
43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_loopers_running = 1;
43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* clean-up any left-over CPU util resources - looper processes,
44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   files, whatever.  raj 2005-01-26 */
44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_terminate() {
44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#ifdef WIN32
44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* it would seem that if/when the process exits, all the threads */
44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* will go away too, so I don't think I need any explicit thread */
44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* killing calls here. raj 1/96 */
44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* now go through and kill-off all the child processes */
45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < lib_num_loc_cpus; i++){
45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* SIGKILL can leave core files behind - thanks to Steinar Haug */
45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* for pointing that out. */
45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    kill(lib_idle_pids[i],SIGTERM);
45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_loopers_running = 0;
45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* reap the children */
46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  while(waitpid(-1, NULL, WNOHANG) > 0) { }
46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* finally, unlink the mmaped file */
46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  munmap((caddr_t)lib_base_pointer,
46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project         ((netlib_get_page_size() * PAGES_PER_CHILD) *
46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          lib_num_loc_cpus));
46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unlink("/tmp/netperf_cpu");
46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_method(void)
47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return LOOPER;
47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* calibrate_looper */
47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* Loop a number of iterations, sleeping interval seconds each and */
48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* count how high the idle counter gets each time. Return  the */
48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project /* measured cpu rate to the calling routine. raj 4/95 */
48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_idle_rate (int iterations, int interval)
48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t
48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    firstcnt[MAXCPUS],
48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    secondcnt[MAXCPUS];
49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float
49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed,
49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_rate,
49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rate[MAXTIMES],
49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_maxrate;
49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  long
49802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sec,
49902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    usec;
50002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int
50202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    i,
50302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    j;
50402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct  timeval time1, time2 ;
50602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct  timezone tz;
50702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (iterations > MAXTIMES) {
50902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    iterations = MAXTIMES;
51002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
51102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_maxrate = (float)-1.0;
51302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for(i = 0; i < iterations; i++) {
51502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rate[i] = (float)0.0;
51602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (j = 0; j < lib_num_loc_cpus; j++) {
51702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      firstcnt[j] = *(lib_idle_address[j]);
51802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
51902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    gettimeofday (&time1, &tz);
52002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sleep(interval);
52102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    gettimeofday (&time2, &tz);
52202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (time2.tv_usec < time1.tv_usec)
52402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      {
52502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        time2.tv_usec += 1000000;
52602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        time2.tv_sec -=1;
52702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
52802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sec = time2.tv_sec - time1.tv_sec;
52902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    usec = time2.tv_usec - time1.tv_usec;
53002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed = (float)sec + ((float)usec/(float)1000000.0);
53102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if(debug) {
53302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "Calibration for counter run: %d\n",i);
53402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"\tsec = %ld usec = %ld\n",sec,usec);
53502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"\telapsed time = %g\n",elapsed);
53602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
53702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
53802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (j = 0; j < lib_num_loc_cpus; j++) {
53902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      secondcnt[j] = *(lib_idle_address[j]);
54002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if(debug) {
54102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* I know that there are situations where compilers know about */
54202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* long long, but the library fucntions do not... raj 4/95 */
54302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
54402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                "\tfirstcnt[%d] = 0x%8.8lx%8.8lx secondcnt[%d] = 0x%8.8lx%8.8lx\n",
54502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                j,
54602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                (uint32_t)(firstcnt[j]>>32),
54702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                (uint32_t)(firstcnt[j]&0xffffffff),
54802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                j,
54902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                (uint32_t)(secondcnt[j]>>32),
55002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                (uint32_t)(secondcnt[j]&0xffffffff));
55102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
55202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we assume that it would wrap no more than once. we also */
55302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* assume that the result of subtracting will "fit" raj 4/95 */
55402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_rate = (secondcnt[j] >= firstcnt[j]) ?
55502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        (float)(secondcnt[j] - firstcnt[j])/elapsed :
55602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (float)(secondcnt[j]-firstcnt[j]+MAXLONG)/elapsed;
55702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (temp_rate > rate[i]) rate[i] = temp_rate;
55802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if(debug) {
55902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"\trate[%d] = %g\n",i,rate[i]);
56002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
56102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
56202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_maxrate < rate[i]) local_maxrate = rate[i];
56302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
56402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
56502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if(debug) {
56602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\tlocal maxrate = %g per sec. \n",local_maxrate);
56702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
56802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
56902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return local_maxrate;
57002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
57102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
57402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_idle (uint64_t *res)
57502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
57602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
57702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
57802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < lib_num_loc_cpus; i++){
57902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    res[i] = *lib_idle_address[i];
58002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
58102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
58202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
58302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
58402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
58502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util_internal(float elapsed_time)
58602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
58702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
58802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float correction_factor;
58902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float actual_rate;
59002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util = (float)0.0;
59202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* It is possible that the library measured a time other than */
59302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the one that the user want for the cpu utilization */
59402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculations - for example, tests that were ended by */
59502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* watchdog timers such as the udp stream test. We let these */
59602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* tests tell up what the elapsed time should be. */
59702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
59802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (elapsed_time != 0.0) {
59902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0 +
60002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      ((lib_elapsed - elapsed_time) / elapsed_time);
60102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
60202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
60302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0;
60402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
60502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < lib_num_loc_cpus; i++) {
60702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
60802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* it would appear that on some systems, in loopback, nice is
60902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     *very* effective, causing the looper process to stop dead in its
61002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     tracks. if this happens, we need to ensure that the calculation
61102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     does not go south. raj 6/95 and if we run completely out of idle,
61202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     the same thing could in theory happen to the USE_KSTAT path. raj
61302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     8/2000 */
61402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
61502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lib_end_count[i] == lib_start_count[i]) {
61602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lib_end_count[i]++;
61702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
61802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
61902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    actual_rate = (lib_end_count[i] > lib_start_count[i]) ?
62002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (float)(lib_end_count[i] - lib_start_count[i])/lib_elapsed :
62102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (float)(lib_end_count[i] - lib_start_count[i] +
62202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      MAXLONG)/ lib_elapsed;
62302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
62402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
62502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "calc_cpu_util: actual_rate on processor %d is %f start 0x%8.8lx%8.8lx end 0x%8.8lx%8.8lx\n",
62602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              i,
62702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              actual_rate,
62802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (uint32_t)(lib_start_count[i]>>32),
62902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (uint32_t)(lib_start_count[i]&0xffffffff),
63002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (uint32_t)(lib_end_count[i]>>32),
63102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              (uint32_t)(lib_end_count[i]&0xffffffff));
63202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
63302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
63402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lib_local_maxrate * 100;
63502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_cpu_util += lib_local_per_cpu_util[i];
63602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
63702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want the average across all n processors */
63802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util /= (float)lib_num_loc_cpus;
63902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util *= correction_factor;
64102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return lib_local_cpu_util;
64202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
64402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
64502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
64602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void)
64702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
64802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_start_count);
64902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
65002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
65102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
65202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
65302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void)
65402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
65502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_end_count);
65602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
657