vmstat.c revision 6caab4ce959478b96c40955236e13e80ef83145d
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 2008, The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * All rights reserved. 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met: 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Redistributions of source code must retain the above copyright 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer in 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the documentation and/or other materials provided with the 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distribution. 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Neither the name of Google, Inc. nor the names of its contributors 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * may be used to endorse or promote products derived from this 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * software without specific prior written permission. 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE. 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/param.h> 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct state { 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long procs_r; 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long procs_b; 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long mem_free; 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long mem_mapped; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long mem_anon; 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long mem_slab; 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long sys_in; 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long sys_cs; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long sys_flt; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long cpu_us; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long cpu_ni; 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long cpu_sy; 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long cpu_id; 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long cpu_wa; 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long cpu_ir; 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project long cpu_si; 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define MAX_LINE 256 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar line[MAX_LINE]; 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void read_state(struct state *s); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int read_meminfo(struct state *s); 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int read_stat(struct state *s); 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int read_vmstat(struct state *s); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void print_header(void); 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void print_line(struct state *old, struct state *new); 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void usage(char *cmd); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint vmstat_main(int argc, char *argv[]) { 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct state s[2]; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int iterations, delay, header_interval; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int toggle, count; 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int i; 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 786caab4ce959478b96c40955236e13e80ef83145dArun Raghavan iterations = -1; 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project delay = 1; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project header_interval = 20; 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (i = 1; i < argc; i++) { 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[i], "-n")) { 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (i >= argc - 1) { 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Option -n requires an argument.\n"); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iterations = atoi(argv[++i]); 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[i], "-d")) { 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (i >= argc - 1) { 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Option -d requires an argument.\n"); 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project delay = atoi(argv[++i]); 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[i], "-r")) { 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (i >= argc - 1) { 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Option -r requires an argument.\n"); 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project header_interval = atoi(argv[++i]); 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strcmp(argv[i], "-h")) { 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(argv[0]); 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_SUCCESS); 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Invalid argument \"%s\".\n", argv[i]); 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(argv[0]); 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project toggle = 0; 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project count = 0; 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!header_interval) 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project print_header(); 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_state(&s[1 - toggle]); 1226caab4ce959478b96c40955236e13e80ef83145dArun Raghavan while ((iterations < 0) || (iterations-- > 0)) { 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sleep(delay); 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_state(&s[toggle]); 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (header_interval) { 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (count == 0) 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project print_header(); 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project count = (count + 1) % header_interval; 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project print_line(&s[1 - toggle], &s[toggle]); 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project toggle = 1 - toggle; 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void read_state(struct state *s) { 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int error; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error = read_meminfo(s); 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (error) { 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "vmstat: could not read /proc/meminfo: %s\n", strerror(error)); 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error = read_stat(s); 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (error) { 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "vmstat: could not read /proc/stat: %s\n", strerror(error)); 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project error = read_vmstat(s); 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (error) { 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "vmstat: could not read /proc/vmstat: %s\n", strerror(error)); 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int read_meminfo(struct state *s) { 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FILE *f; 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project f = fopen("/proc/meminfo", "r"); 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!f) return errno; 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (fgets(line, MAX_LINE, f)) { 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "MemFree: %ld kB", &s->mem_free); 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "AnonPages: %ld kB", &s->mem_anon); 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "Mapped: %ld kB", &s->mem_mapped); 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "Slab: %ld kB", &s->mem_slab); 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fclose(f); 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int read_stat(struct state *s) { 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FILE *f; 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project f = fopen("/proc/stat", "r"); 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!f) return errno; 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (fgets(line, MAX_LINE, f)) { 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!strncmp(line, "cpu ", 4)) { 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "cpu %ld %ld %ld %ld %ld %ld %ld", 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &s->cpu_us, &s->cpu_ni, &s->cpu_sy, &s->cpu_id, &s->cpu_wa, 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &s->cpu_ir, &s->cpu_si); 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "intr %ld", &s->sys_in); 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "ctxt %ld", &s->sys_cs); 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "procs_running %ld", &s->procs_r); 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "procs_blocked %ld", &s->procs_b); 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fclose(f); 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic int read_vmstat(struct state *s) { 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FILE *f; 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project f = fopen("/proc/vmstat", "r"); 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!f) return errno; 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (fgets(line, MAX_LINE, f)) { 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sscanf(line, "pgmajfault %ld", &s->sys_flt); 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fclose(f); 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void print_header(void) { 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%-5s %-27s %-14s %-17s\n", "procs", "memory", "system", "cpu"); 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%2s %2s %6s %6s %6s %6s %4s %4s %4s %2s %2s %2s %2s %2s %2s\n", "r", "b", "free", "mapped", "anon", "slab", "in", "cs", "flt", "us", "ni", "sy", "id", "wa", "ir"); 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* Jiffies to percent conversion */ 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define JP(jif) ((jif) * 100 / (HZ)) 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define NORM(var) ((var) = (((var) > 99) ? (99) : (var))) 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void print_line(struct state *old, struct state *new) { 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int us, ni, sy, id, wa, ir; 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project us = JP(new->cpu_us - old->cpu_us); NORM(us); 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ni = JP(new->cpu_ni - old->cpu_ni); NORM(ni); 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sy = JP(new->cpu_sy - old->cpu_sy); NORM(sy); 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project id = JP(new->cpu_id - old->cpu_id); NORM(id); 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project wa = JP(new->cpu_wa - old->cpu_wa); NORM(wa); 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ir = JP(new->cpu_ir - old->cpu_ir); NORM(ir); 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%2ld %2ld %6ld %6ld %6ld %6ld %4ld %4ld %4ld %2d %2d %2d %2d %2d %2d\n", 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new->procs_r ? (new->procs_r - 1) : 0, new->procs_b, 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new->mem_free, new->mem_mapped, new->mem_anon, new->mem_slab, 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new->sys_in - old->sys_in, new->sys_cs - old->sys_cs, new->sys_flt - old->sys_flt, 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project us, ni, sy, id, wa, ir); 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void usage(char *cmd) { 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "Usage: %s [ -h ] [ -n iterations ] [ -d delay ] [ -r header_repeat ]\n" 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -n iterations How many rows of data to print.\n" 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -d delay How long to sleep between rows.\n" 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -r header_repeat How many rows to print before repeating\n" 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " the header. Zero means never repeat.\n" 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " -h Displays this help screen.\n", 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project cmd); 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 248