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