Changeset View
Changeset View
Standalone View
Standalone View
head/usr.bin/systat/iostat.c
Show First 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | |||||
#include <paths.h> | #include <paths.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include "systat.h" | #include "systat.h" | ||||
#include "extern.h" | #include "extern.h" | ||||
#include "devs.h" | #include "devs.h" | ||||
struct statinfo cur, last; | |||||
static int linesperregion; | static int linesperregion; | ||||
static double etime; | static double etime; | ||||
static int numbers = 0; /* default display bar graphs */ | static int numbers = 0; /* default display bar graphs */ | ||||
static int kbpt = 0; /* default ms/seek shown */ | static int kbpt = 0; /* default ms/seek shown */ | ||||
static int barlabels(int); | static int barlabels(int); | ||||
static void histogram(long double, int, double); | static void histogram(long double, int, double); | ||||
static int numlabels(int); | static int numlabels(int); | ||||
Show All 14 Lines | closeiostat(WINDOW *w) | ||||
wclear(w); | wclear(w); | ||||
wrefresh(w); | wrefresh(w); | ||||
delwin(w); | delwin(w); | ||||
} | } | ||||
int | int | ||||
initiostat(void) | initiostat(void) | ||||
{ | { | ||||
if ((num_devices = devstat_getnumdevs(NULL)) < 0) | |||||
return(0); | |||||
cur.dinfo = calloc(1, sizeof(struct devinfo)); | |||||
last.dinfo = calloc(1, sizeof(struct devinfo)); | |||||
/* | /* | ||||
* This value for maxshowdevs (100) is bogus. I'm not sure exactly | * This value for maxshowdevs (100) is bogus. I'm not sure exactly | ||||
* how to calculate it, though. | * how to calculate it, though. | ||||
*/ | */ | ||||
if (dsinit(100, &cur, &last, NULL) != 1) | if (dsinit(7) != 1) | ||||
return(0); | return(0); | ||||
return(1); | return(1); | ||||
} | } | ||||
void | void | ||||
fetchiostat(void) | fetchiostat(void) | ||||
{ | { | ||||
struct devinfo *tmp_dinfo; | struct devinfo *tmp_dinfo; | ||||
size_t len; | size_t len; | ||||
len = sizeof(cur.cp_time); | len = sizeof(cur_dev.cp_time); | ||||
if (sysctlbyname("kern.cp_time", &cur.cp_time, &len, NULL, 0) | if (sysctlbyname("kern.cp_time", &cur_dev.cp_time, &len, NULL, 0) | ||||
|| len != sizeof(cur.cp_time)) { | || len != sizeof(cur_dev.cp_time)) { | ||||
perror("kern.cp_time"); | perror("kern.cp_time"); | ||||
exit (1); | exit (1); | ||||
} | } | ||||
tmp_dinfo = last.dinfo; | tmp_dinfo = last_dev.dinfo; | ||||
last.dinfo = cur.dinfo; | last_dev.dinfo = cur_dev.dinfo; | ||||
cur.dinfo = tmp_dinfo; | cur_dev.dinfo = tmp_dinfo; | ||||
last.snap_time = cur.snap_time; | last_dev.snap_time = cur_dev.snap_time; | ||||
/* | /* | ||||
* Here what we want to do is refresh our device stats. | * Here what we want to do is refresh our device stats. | ||||
* getdevs() returns 1 when the device list has changed. | * getdevs() returns 1 when the device list has changed. | ||||
* If the device list has changed, we want to go through | * If the device list has changed, we want to go through | ||||
* the selection process again, in case a device that we | * the selection process again, in case a device that we | ||||
* were previously displaying has gone away. | * were previously displaying has gone away. | ||||
*/ | */ | ||||
switch (devstat_getdevs(NULL, &cur)) { | switch (devstat_getdevs(NULL, &cur_dev)) { | ||||
case -1: | case -1: | ||||
errx(1, "%s", devstat_errbuf); | errx(1, "%s", devstat_errbuf); | ||||
break; | break; | ||||
case 1: | case 1: | ||||
cmdiostat("refresh", NULL); | cmdiostat("refresh", NULL); | ||||
break; | break; | ||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
num_devices = cur.dinfo->numdevs; | num_devices = cur_dev.dinfo->numdevs; | ||||
generation = cur.dinfo->generation; | generation = cur_dev.dinfo->generation; | ||||
} | } | ||||
#define INSET 10 | #define INSET 10 | ||||
void | void | ||||
labeliostat(void) | labeliostat(void) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 80 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
void | void | ||||
showiostat(void) | showiostat(void) | ||||
{ | { | ||||
long t; | long t; | ||||
int i, row, _col; | int i, row, _col; | ||||
#define X(fld) t = cur.fld[i]; cur.fld[i] -= last.fld[i]; last.fld[i] = t | #define X(fld) t = cur_dev.fld[i]; cur_dev.fld[i] -= last_dev.fld[i]; last_dev.fld[i] = t | ||||
etime = 0; | etime = 0; | ||||
for(i = 0; i < CPUSTATES; i++) { | for(i = 0; i < CPUSTATES; i++) { | ||||
X(cp_time); | X(cp_time); | ||||
etime += cur.cp_time[i]; | etime += cur_dev.cp_time[i]; | ||||
} | } | ||||
if (etime == 0.0) | if (etime == 0.0) | ||||
etime = 1.0; | etime = 1.0; | ||||
etime /= hertz; | etime /= hertz; | ||||
row = 1; | row = 1; | ||||
for (i = 0; i < CPUSTATES; i++) | for (i = 0; i < CPUSTATES; i++) | ||||
stat1(row++, i); | stat1(row++, i); | ||||
if (!numbers) { | if (!numbers) { | ||||
Show All 32 Lines | |||||
{ | { | ||||
long double transfers_per_second; | long double transfers_per_second; | ||||
long double kb_per_transfer, mb_per_second; | long double kb_per_transfer, mb_per_second; | ||||
long double busy_seconds; | long double busy_seconds; | ||||
int di; | int di; | ||||
di = dev_select[dn].position; | di = dev_select[dn].position; | ||||
busy_seconds = cur.snap_time - last.snap_time; | busy_seconds = cur_dev.snap_time - last_dev.snap_time; | ||||
if (devstat_compute_statistics(&cur.dinfo->devices[di], | if (devstat_compute_statistics(&cur_dev.dinfo->devices[di], | ||||
&last.dinfo->devices[di], busy_seconds, | &last_dev.dinfo->devices[di], busy_seconds, | ||||
DSM_KB_PER_TRANSFER, &kb_per_transfer, | DSM_KB_PER_TRANSFER, &kb_per_transfer, | ||||
DSM_TRANSFERS_PER_SECOND, &transfers_per_second, | DSM_TRANSFERS_PER_SECOND, &transfers_per_second, | ||||
DSM_MB_PER_SECOND, &mb_per_second, DSM_NONE) != 0) | DSM_MB_PER_SECOND, &mb_per_second, DSM_NONE) != 0) | ||||
errx(1, "%s", devstat_errbuf); | errx(1, "%s", devstat_errbuf); | ||||
if (numbers) { | if (numbers) { | ||||
mvwprintw(wnd, row, _col, " %5.2Lf %3.0Lf %5.2Lf ", | mvwprintw(wnd, row, _col, " %5.2Lf %3.0Lf %5.2Lf ", | ||||
kb_per_transfer, transfers_per_second, | kb_per_transfer, transfers_per_second, | ||||
Show All 16 Lines | |||||
static void | static void | ||||
stat1(int row, int o) | stat1(int row, int o) | ||||
{ | { | ||||
int i; | int i; | ||||
double dtime; | double dtime; | ||||
dtime = 0.0; | dtime = 0.0; | ||||
for (i = 0; i < CPUSTATES; i++) | for (i = 0; i < CPUSTATES; i++) | ||||
dtime += cur.cp_time[i]; | dtime += cur_dev.cp_time[i]; | ||||
if (dtime == 0.0) | if (dtime == 0.0) | ||||
dtime = 1.0; | dtime = 1.0; | ||||
wmove(wnd, row, INSET); | wmove(wnd, row, INSET); | ||||
#define CPUSCALE 0.5 | #define CPUSCALE 0.5 | ||||
histogram(100.0 * cur.cp_time[o] / dtime, 50, CPUSCALE); | histogram(100.0 * cur_dev.cp_time[o] / dtime, 50, CPUSCALE); | ||||
} | } | ||||
static void | static void | ||||
histogram(long double val, int colwidth, double scale) | histogram(long double val, int colwidth, double scale) | ||||
{ | { | ||||
char buf[10]; | char buf[10]; | ||||
int k; | int k; | ||||
int v = (int)(val * scale) + 0.5; | int v = (int)(val * scale) + 0.5; | ||||
Show All 17 Lines | |||||
{ | { | ||||
if (prefix(cmd, "kbpt")) | if (prefix(cmd, "kbpt")) | ||||
kbpt = !kbpt; | kbpt = !kbpt; | ||||
else if (prefix(cmd, "numbers")) | else if (prefix(cmd, "numbers")) | ||||
numbers = 1; | numbers = 1; | ||||
else if (prefix(cmd, "bars")) | else if (prefix(cmd, "bars")) | ||||
numbers = 0; | numbers = 0; | ||||
else if (!dscmd(cmd, args, 100, &cur)) | else if (!dscmd(cmd, args, 100, &cur_dev)) | ||||
return (0); | return (0); | ||||
wclear(wnd); | wclear(wnd); | ||||
labeliostat(); | labeliostat(); | ||||
refresh(); | refresh(); | ||||
return (1); | return (1); | ||||
} | } |