Author: sbruno
Date: Fri May 21 17:10:52 2010
New Revision: 208389
URL: http://svn.freebsd.org/changeset/base/208389

Log:
  Allow sub-second interval timings for iostat and vmstat.
  e.g.
  vmstat -w.5
  iostat -w.5
  
  Reviewed by:  jhb
  Approved by:  scottl (mentor)
  Obtained from:        Yahoo Inc.
  MFC after:    2 weeks

Modified:
  head/usr.bin/vmstat/vmstat.8
  head/usr.bin/vmstat/vmstat.c
  head/usr.sbin/iostat/iostat.8
  head/usr.sbin/iostat/iostat.c

Modified: head/usr.bin/vmstat/vmstat.8
==============================================================================
--- head/usr.bin/vmstat/vmstat.8        Fri May 21 16:58:52 2010        
(r208388)
+++ head/usr.bin/vmstat/vmstat.8        Fri May 21 17:10:52 2010        
(r208389)
@@ -209,6 +209,9 @@ seconds between each display.
 If no repeat
 .Ar wait
 interval is specified, the default is 1 second.
+The
+.Nm
+command will accept and honor a non-integer number of seconds.
 .It Fl z
 Report on memory used by the kernel zone allocator,
 .Xr uma 9 ,

Modified: head/usr.bin/vmstat/vmstat.c
==============================================================================
--- head/usr.bin/vmstat/vmstat.c        Fri May 21 16:58:52 2010        
(r208388)
+++ head/usr.bin/vmstat/vmstat.c        Fri May 21 17:10:52 2010        
(r208389)
@@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/ioctl.h>
 #include <sys/resource.h>
 #include <sys/sysctl.h>
+#include <sys/time.h>
 #include <sys/vmmeter.h>
 #include <sys/pcpu.h>
 
@@ -181,6 +182,7 @@ main(int argc, char *argv[])
 {
        int c, todo;
        unsigned int interval;
+       float f;
        int reps;
        char *memf, *nlistf;
        char errbuf[_POSIX2_LINE_MAX];
@@ -243,7 +245,9 @@ main(int argc, char *argv[])
 #endif
                        break;
                case 'w':
-                       interval = atoi(optarg);
+                       /* Convert to milliseconds. */
+                       f = atof(optarg);
+                       interval = f * 1000;
                        break;
                case 'z':
                        todo |= ZMEMSTAT;
@@ -298,7 +302,8 @@ main(int argc, char *argv[])
 #define        BACKWARD_COMPATIBILITY
 #ifdef BACKWARD_COMPATIBILITY
        if (*argv) {
-               interval = atoi(*argv);
+               f = atof(*argv);
+               interval = f * 1000;
                if (*++argv)
                        reps = atoi(*argv);
        }
@@ -308,7 +313,7 @@ main(int argc, char *argv[])
                if (!reps)
                        reps = -1;
        } else if (reps)
-               interval = 1;
+               interval = 1 * 1000;
 
        if (todo & FORKSTAT)
                doforkst();
@@ -652,9 +657,11 @@ dovmstat(unsigned int interval, int reps
        size_t size;
        int ncpus, maxid;
        u_long cpumask;
+       int rate_adj;
 
        uptime = getuptime();
        halfuptime = uptime / 2;
+       rate_adj = 1;
 
        /*
         * If the user stops the program (control-Z) and then resumes it,
@@ -766,7 +773,7 @@ dovmstat(unsigned int interval, int reps
                (void)printf("%2d %1d %1d",
                    total.t_rq - 1, total.t_dw + total.t_pw, total.t_sw);
 #define vmstat_pgtok(a) ((a) * (sum.v_page_size >> 10))
-#define        rate(x) (((x) + halfuptime) / uptime)   /* round */
+#define        rate(x) (((x) * rate_adj + halfuptime) / uptime)        /* 
round */
                if (hflag) {
                        printf(" ");
                        prthuman(total.t_avm * (u_int64_t)sum.v_page_size, 7);
@@ -806,15 +813,16 @@ dovmstat(unsigned int interval, int reps
                        break;
                osum = sum;
                uptime = interval;
+               rate_adj = 1000;
                /*
                 * We round upward to avoid losing low-frequency events
-                * (i.e., >= 1 per interval but < 1 per second).
+                * (i.e., >= 1 per interval but < 1 per millisecond).
                 */
                if (interval != 1)
                        halfuptime = (uptime + 1) / 2;
                else
                        halfuptime = 0;
-               (void)sleep(interval);
+               (void)usleep(interval * 1000);
        }
 }
 

Modified: head/usr.sbin/iostat/iostat.8
==============================================================================
--- head/usr.sbin/iostat/iostat.8       Fri May 21 16:58:52 2010        
(r208388)
+++ head/usr.sbin/iostat/iostat.8       Fri May 21 17:10:52 2010        
(r208389)
@@ -239,6 +239,9 @@ seconds between each display.
 If no repeat
 .Ar count
 is specified, the default is infinity.
+The
+.Nm
+command will accept and honor a non-integer number of seconds.
 .It Fl x
 Show extended disk statistics.
 Each disk is displayed on a line of its own with all available statistics.

Modified: head/usr.sbin/iostat/iostat.c
==============================================================================
--- head/usr.sbin/iostat/iostat.c       Fri May 21 16:58:52 2010        
(r208388)
+++ head/usr.sbin/iostat/iostat.c       Fri May 21 17:10:52 2010        
(r208389)
@@ -184,6 +184,7 @@ main(int argc, char **argv)
        long select_generation;
        char **specified_devices;
        devstat_select_mode select_mode;
+       float f;
        int havelast = 0;
 
        matches = NULL;
@@ -239,9 +240,10 @@ main(int argc, char **argv)
                                break;
                        case 'w':
                                wflag++;
-                               waittime = atoi(optarg);
+                               f = atof(optarg);
+                               waittime = f * 1000;
                                if (waittime < 1)
-                                       errx(1, "wait time is < 1");
+                                       errx(1, "wait time is < 1ms");
                                break;
                        case 'x':
                                xflag++;
@@ -378,12 +380,13 @@ main(int argc, char **argv)
         * Look for the traditional wait time and count arguments.
         */
        if (*argv) {
-               waittime = atoi(*argv);
+               f = atof(*argv);
+               waittime = f * 1000;
 
                /* Let the user know he goofed, but keep going anyway */
                if (wflag != 0)
                        warnx("discarding previous wait interval, using"
-                             " %d instead", waittime);
+                             " %g instead", waittime / 1000.0);
                wflag++;
 
                if (*++argv) {
@@ -401,7 +404,7 @@ main(int argc, char **argv)
         * to an interval of 1 second.
         */
        if ((wflag == 0) && (cflag > 0))
-               waittime = 1;
+               waittime = 1 * 1000;
 
        /*
         * If the user specified a wait time, but not a count, we want to
@@ -602,7 +605,7 @@ main(int argc, char **argv)
                if (count >= 0 && --count <= 0)
                        break;
 
-               sleep(waittime);
+               usleep(waittime * 1000);
                havelast = 1;
        }
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to