Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
netcpu_procstat.c
Package: netperf-2.4.4.tar.gz [view]
Upload User: kvgkvg
Upload Date: 2015-05-07
Package Size: 1129k
Code Size: 6k
Category:
Linux-Unix program
Development Platform:
C/C++
- char netcpu_procstat_id[]="
- @(#)netcpu_procstat.c (c) Copyright 2005-2007 Version 2.4.3";
- /* netcpu_procstat.c
- Implement the /proc/stat specific portions of netperf CPU
- utilization measurements. These are broken-out into a separate file
- to make life much nicer over in netlib.c which had become a maze of
- twisty, CPU-util-related, #ifdefs, all different. raj 2005-01-26
- */
- #ifdef HAVE_CONFIG_H
- #include <config.h>
- #endif
- #include <stdio.h>
- #ifdef HAVE_FCNTL_H
- # include <fcntl.h>
- #endif
- #if HAVE_UNISTD_H
- # include <unistd.h>
- #endif
- #if STDC_HEADERS
- # include <stdlib.h>
- # include <stddef.h>
- #else
- # if HAVE_STDLIB_H
- # include <stdlib.h>
- # endif
- #endif
- #include <string.h>
- #include "netsh.h"
- #include "netlib.h"
- /* the lib_start_count and lib_end_count arrays hold the starting
- and ending values of whatever is counting when the system is
- idle. The rate at which this increments during a test is compared
- with a previous calibrarion to arrive at a CPU utilization
- percentage. raj 2005-01-26 */
- static uint64_t lib_start_count[MAXCPUS];
- static uint64_t lib_end_count[MAXCPUS];
- /* The max. length of one line of /proc/stat cpu output */
- #define CPU_LINE_LENGTH ((8 * sizeof (long) / 3 + 1) * 4 + 8)
- #define PROC_STAT_FILE_NAME "/proc/stat"
- #define N_CPU_LINES(nr) (nr == 1 ? 1 : 1 + nr)
- static int proc_stat_fd = -1;
- static char *proc_stat_buf = NULL;
- static int proc_stat_buflen = 0;
- void
- cpu_util_init(void)
- {
- if (debug) {
- fprintf(where,
- "cpu_util_init enter, proc_stat_fd %d proc_stat_buf %pn",
- proc_stat_fd,
- proc_stat_buf);
- fflush(where);
- }
- if (proc_stat_fd < 0) {
- proc_stat_fd = open (PROC_STAT_FILE_NAME, O_RDONLY, NULL);
- if (proc_stat_fd < 0) {
- fprintf (stderr, "Cannot open %s!n", PROC_STAT_FILE_NAME);
- exit (1);
- };
- };
- if (!proc_stat_buf) {
- proc_stat_buflen = N_CPU_LINES (lib_num_loc_cpus) * CPU_LINE_LENGTH;
- if (debug) {
- fprintf(where,
- "lib_num_loc_cpus %d lines %d CPU_LINE_LENGTH %d proc_stat_buflen %dn",
- lib_num_loc_cpus,
- N_CPU_LINES(lib_num_loc_cpus),
- CPU_LINE_LENGTH,
- proc_stat_buflen);
- fflush(where);
- }
- proc_stat_buf = (char *)malloc (proc_stat_buflen);
- if (!proc_stat_buf) {
- fprintf (stderr, "Cannot allocate buffer memory!n");
- exit (1);
- }
- }
- return;
- }
- void
- cpu_util_terminate(void)
- {
- close(proc_stat_fd);
- proc_stat_fd = -1;
- free(proc_stat_buf);
- proc_stat_buf = NULL;
- return;
- }
- int
- get_cpu_method()
- {
- return PROC_STAT;
- }
- float
- calibrate_idle_rate (int iterations, int interval)
- {
- if (proc_stat_fd < 0) {
- proc_stat_fd = open (PROC_STAT_FILE_NAME, O_RDONLY, NULL);
- if (proc_stat_fd < 0) {
- fprintf (stderr, "Cannot open %s!n", PROC_STAT_FILE_NAME);
- exit (1);
- };
- };
- if (!proc_stat_buf) {
- proc_stat_buflen = N_CPU_LINES (lib_num_loc_cpus) * CPU_LINE_LENGTH;
- if (debug) {
- fprintf(where,
- "calibrate: lib_num_loc_cpus %d lines %d CPU_LINE_LENGTH %d proc_stat_buflen %dn",
- lib_num_loc_cpus,
- N_CPU_LINES(lib_num_loc_cpus),
- CPU_LINE_LENGTH,
- proc_stat_buflen);
- fflush(where);
- }
- proc_stat_buf = (char *)malloc (proc_stat_buflen);
- if (!proc_stat_buf) {
- fprintf (stderr, "Cannot allocate buffer memory!n");
- exit (1);
- };
- };
- return sysconf (_SC_CLK_TCK);
- }
- void
- get_cpu_idle (uint64_t *res)
- {
- int space;
- int i;
- int n = lib_num_loc_cpus;
- char *p = proc_stat_buf;
- lseek (proc_stat_fd, 0, SEEK_SET);
- read (proc_stat_fd, p, proc_stat_buflen);
- if (debug) {
- fprintf(where,"proc_stat_buf '%.*s'n",proc_stat_buflen,p);
- fflush(where);
- }
- /* Skip first line (total) on SMP */
- if (n > 1) p = strchr (p, 'n');
- /* Idle time is the 4th space-separated token */
- for (i = 0; i < n; i++) {
- for (space = 0; space < 4; space ++) {
- p = strchr (p, ' ');
- while (*++p == ' ');
- };
- res[i] = strtoul (p, &p, 10);
- if (debug) {
- fprintf(where,"res[%d] is %llun",i,res[i]);
- fflush(where);
- }
- p = strchr (p, 'n');
- };
- }
- /* take the initial timestamp and start collecting CPU utilization if
- requested */
- void
- measure_cpu_start()
- {
- cpu_method = PROC_STAT;
- get_cpu_idle(lib_start_count);
- }
- /* collect final CPU utilization raw data */
- void
- measure_cpu_stop()
- {
- get_cpu_idle(lib_end_count);
- }
- float
- calc_cpu_util_internal(float elapsed_time)
- {
- int i;
- float actual_rate;
- float correction_factor;
- lib_local_cpu_util = (float)0.0;
- /* It is possible that the library measured a time other than */
- /* the one that the user want for the cpu utilization */
- /* calculations - for example, tests that were ended by */
- /* watchdog timers such as the udp stream test. We let these */
- /* tests tell up what the elapsed time should be. */
- if (elapsed_time != 0.0) {
- correction_factor = (float) 1.0 +
- ((lib_elapsed - elapsed_time) / elapsed_time);
- }
- else {
- correction_factor = (float) 1.0;
- }
- for (i = 0; i < lib_num_loc_cpus; i++) {
- /* it would appear that on some systems, in loopback, nice is
- *very* effective, causing the looper process to stop dead in its
- tracks. if this happens, we need to ensure that the calculation
- does not go south. raj 6/95 and if we run completely out of idle,
- the same thing could in theory happen to the USE_KSTAT path. raj
- 8/2000 */
- if (lib_end_count[i] == lib_start_count[i]) {
- lib_end_count[i]++;
- }
- actual_rate = (lib_end_count[i] > lib_start_count[i]) ?
- (float)(lib_end_count[i] - lib_start_count[i])/lib_elapsed :
- (float)(lib_end_count[i] - lib_start_count[i] +
- MAXLONG)/ lib_elapsed;
- lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
- lib_local_maxrate * 100;
- if (debug) {
- fprintf(where,
- "calc_cpu_util: actual_rate on processor %d is %f start %llx end %llx util %fn",
- i,
- actual_rate,
- lib_start_count[i],
- lib_end_count[i],
- lib_local_per_cpu_util[i]);
- }
- lib_local_cpu_util += lib_local_per_cpu_util[i];
- }
- /* we want the average across all n processors */
- lib_local_cpu_util /= (float)lib_num_loc_cpus;
- lib_local_cpu_util *= correction_factor;
- return lib_local_cpu_util;
- }
- void
- cpu_start_internal(void)
- {
- get_cpu_idle(lib_start_count);
- return;
- }
- void
- cpu_stop_internal(void)
- {
- get_cpu_idle(lib_end_count);
- }