* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)iostat.c 5.2 (Berkeley) 12/11/85";
return (subwin(stdscr
, LINES
-1-5, 0, 5, 0));
static struct nlist nlst
[] = {
static int linesperregion
;
static int numbers
= 0; /* default display bar graphs */
static int msps
= 0; /* default ms/seek shown */
if (nlst
[X_DK_BUSY
].n_type
== 0) {
if (nlst
[X_DK_BUSY
].n_type
== 0) {
error("Disk init information isn't in namelist");
s./**/e = (t *)calloc(dk_ndrive, sizeof (t)); \
s1./**/e = (t *)calloc(dk_ndrive, sizeof (t));
if (nlst
[X_DK_BUSY
].n_type
== 0)
s
.dk_busy
= getw(nlst
[X_DK_BUSY
].n_value
);
lseek(kmem
, (long)nlst
[X_DK_TIME
].n_value
, L_SET
);
read(kmem
, s
.dk_time
, dk_ndrive
* sizeof (long));
lseek(kmem
, (long)nlst
[X_DK_XFER
].n_value
, L_SET
);
read(kmem
, s
.dk_xfer
, dk_ndrive
* sizeof (long));
lseek(kmem
, (long)nlst
[X_DK_WDS
].n_value
, L_SET
);
read(kmem
, s
.dk_wds
, dk_ndrive
* sizeof (long));
lseek(kmem
, (long)nlst
[X_DK_SEEK
].n_value
, L_SET
);
read(kmem
, s
.dk_seek
, dk_ndrive
* sizeof (long));
lseek(kmem
, (long)nlst
[X_CP_TIME
].n_value
, L_SET
);
read(kmem
, s
.cp_time
, sizeof s
.cp_time
);
if (nlst
[X_DK_BUSY
].n_type
== 0) {
error("No dk_busy defined.");
wmove(wnd
, row
, 0); wclrtobot(wnd
);
mvwaddstr(wnd
, row
++, INSET
,
"/0 /10 /20 /30 /40 /50 /60 /70 /80 /90 /100");
mvwaddstr(wnd
, row
++, 0, "cpu user|");
mvwaddstr(wnd
, row
++, 0, " nice|");
mvwaddstr(wnd
, row
++, 0, " system|");
mvwaddstr(wnd
, row
++, 0, " idle|");
row
= numlabels(row
+ 1);
row
= barlabels(row
+ 1);
int i
, col
, regions
, ndrives
;
#define DRIVESPERLINE ((wnd->_maxx - INSET) / COLWIDTH)
for (ndrives
= 0, i
= 0; i
< dk_ndrive
; i
++)
regions
= howmany(ndrives
, DRIVESPERLINE
);
* Deduct -regions for blank line after each scrolling region.
linesperregion
= (wnd
->_maxy
- row
- regions
) / regions
;
* Minimum region contains space for two
* label lines and one line of statistics.
for (i
= 0; i
< dk_ndrive
; i
++)
if (dk_select
[i
] && dk_mspw
[i
] != 0.0) {
if (col
+ COLWIDTH
>= wnd
->_maxx
- INSET
) {
col
= 0, row
+= linesperregion
+ 1;
if (row
> wnd
->_maxy
- (linesperregion
+ 1))
mvwaddstr(wnd
, row
, col
+ 4, dr_name
[i
]);
mvwaddstr(wnd
, row
+ 1, col
, "bps tps msps");
row
+= linesperregion
+ 1;
mvwaddstr(wnd
, row
++, INSET
,
"/0 /5 /10 /15 /20 /25 /30 /35 /40 /45 /50");
linesperregion
= 2 + msps
;
for (i
= 0; i
< dk_ndrive
; i
++)
if (dk_select
[i
] && dk_mspw
[i
] != 0.0) {
if (row
> wnd
->_maxy
- linesperregion
)
mvwprintw(wnd
, row
++, 0, "%3.3s bps|", dr_name
[i
]);
mvwaddstr(wnd
, row
++, 0, " tps|");
mvwaddstr(wnd
, row
++, 0, " msps|");
register int i
, row
, col
;
if (nlst
[X_DK_BUSY
].n_type
== 0)
for (i
= 0; i
< dk_ndrive
; i
++) {
#define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
X(dk_xfer
); X(dk_seek
); X(dk_wds
); X(dk_time
);
for(i
= 0; i
< CPUSTATES
; i
++) {
for (i
= 0; i
< CPUSTATES
; i
++)
for (i
= 0; i
< dk_ndrive
; i
++)
if (dk_select
[i
] && dk_mspw
[i
] != 0.0) {
if (row
> wnd
->_maxy
- linesperregion
)
row
= stats(row
, INSET
, i
);
wmove(wnd
, row
+ linesperregion
, 0);
for (i
= 0; i
< dk_ndrive
; i
++)
if (dk_select
[i
] && dk_mspw
[i
] != 0.0) {
if (col
+ COLWIDTH
>= wnd
->_maxx
) {
col
= 0, row
+= linesperregion
+ 1;
if (row
> wnd
->_maxy
- (linesperregion
+ 1))
wmove(wnd
, row
+ linesperregion
, 0);
(void) stats(row
+ 3, col
, i
);
double atime
, words
, xtime
, itime
;
words
= s
.dk_wds
[dn
]*32.0; /* number of words transferred */
xtime
= dk_mspw
[dn
]*words
; /* transfer time */
itime
= atime
- xtime
; /* time not transferring */
itime
+= xtime
, xtime
= 0;
xtime
+= itime
, itime
= 0;
mvwprintw(wnd
, row
, col
, "%3.0f%4.0f%5.1f",
words
/ 512 / etime
, s
.dk_xfer
[dn
] / etime
,
s
.dk_seek
[dn
] ? itime
* 1000. / s
.dk_seek
[dn
] : 0.0);
histogram(words
/ 512 / etime
, 50, 1.0);
histogram(s
.dk_xfer
[dn
] / etime
, 50, 1.0);
histogram(s
.dk_seek
[dn
] ? itime
* 1000. / s
.dk_seek
[dn
] : 0,
for (i
= 0; i
< CPUSTATES
; i
++)
histogram(100 * s
.cp_time
[o
] / time
, 50, CPUSCALE
);
histogram(val
, colwidth
, scale
)
register int v
= (int)(val
* scale
) + 0.5;
sprintf(buf
, "%4.1f", val
);
else if (prefix(cmd
, "numbers"))
else if (prefix(cmd
, "bars"))
else if (!dkcmd(cmd
, args
))