socsvn commit: r270204 - soc2014/zkorchev/freebsd_head/usr.sbin/iostat

zkorchev at FreeBSD.org zkorchev at FreeBSD.org
Mon Jun 30 08:01:05 UTC 2014


Author: zkorchev
Date: Mon Jun 30 08:01:03 2014
New Revision: 270204
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=270204

Log:
  libsol support for iostat

Modified:
  soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile
  soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c

Modified: soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile	Mon Jun 30 05:33:52 2014	(r270203)
+++ soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile	Mon Jun 30 08:01:03 2014	(r270204)
@@ -5,7 +5,8 @@
 MAN=	iostat.8
 
 DPADD=	${LIBDEVSTAT} ${LIBKVM} ${LIBM}
-LDADD=	-ldevstat -lkvm -lm
+LDADD=	-ldevstat -lkvm -lm -lsol
+CFLAGS+=-DSOL_ON -I/usr/local/include
 
 WARNS?=	1
 

Modified: soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c	Mon Jun 30 05:33:52 2014	(r270203)
+++ soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c	Mon Jun 30 08:01:03 2014	(r270204)
@@ -115,6 +115,9 @@
 #include <string.h>
 #include <termios.h>
 #include <unistd.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
 
 struct nlist namelist[] = {
 #define X_TTY_NIN	0
@@ -139,6 +142,11 @@
 int dflag = 0, Iflag = 0, Cflag = 0, Tflag = 0, oflag = 0, Kflag = 0;
 int xflag = 0, zflag = 0;
 
+int sol_format;
+#if defined(SOL_ON)
+static struct sol_stream sol_stream;
+#endif
+
 /* local function declarations */
 static void usage(void);
 static void needhdr(int signo);
@@ -442,6 +450,11 @@
 		wrows = IOSTAT_DEFAULT_ROWS;
 	}
 
+#if defined(SOL_ON)
+	sol_format = sol_init(&sol_stream);
+	if (sol_format) sol_map_start(&sol_stream);
+#endif
+
 	for (headercount = 1;;) {
 		struct devinfo *tmp_dinfo;
 		long tmp;
@@ -585,9 +598,22 @@
 			last.cp_time[i] = tmp;
 		}
 
-		if (xflag == 0 && Tflag > 0)
-			printf("%4.0Lf %5.0Lf", cur.tk_nin / etime,
-			    cur.tk_nout / etime);
+		if (xflag == 0 && Tflag > 0) {
+#if defined(SOL_ON)
+			if (sol_format)
+			{
+				SOL_MAP_KEYL(&sol_stream, "tin");
+				sol_float(&sol_stream, cur.tk_nin / etime);
+				SOL_MAP_KEYL(&sol_stream, "tout");
+				sol_float(&sol_stream, cur.tk_nout / etime);
+			}
+			else
+#endif
+			{
+				printf("%4.0Lf %5.0Lf", cur.tk_nin / etime,
+					cur.tk_nout / etime);
+			}
+		}
 
 		devstats(hflag, etime, havelast);
 
@@ -606,6 +632,13 @@
 		havelast = 1;
 	}
 
+#if defined(SOL_ON)
+	if (sol_format) {
+		sol_map_end(&sol_stream);
+		sol_term(&sol_stream);
+	}
+#endif
+
 	exit(0);
 }
 
@@ -666,6 +699,10 @@
 	int i, printed;
 	char devbuf[256];
 
+#if defined(SOL_ON)
+	if (sol_format) return;
+#endif
+
 	/*
 	 * If xflag is set, we need a per-loop header, not a page header, so
 	 * just return.  We'll print the header in devstats().
@@ -738,7 +775,11 @@
 	int firstline = 1;
 	char *devname;
 
+#if defined(SOL_ON)
+	if ((xflag > 0) && !sol_format) {
+#else
 	if (xflag > 0) {
+#endif
 		printf("                        extended device statistics  ");
 		if (Tflag > 0)
 			printf("      tty ");
@@ -819,73 +860,180 @@
 			    mb_per_second_read > ((long double).0005)/1024 ||
 			    mb_per_second_write > ((long double).0005)/1024 ||
 			    busy_pct > 0.5) {
-				if (Iflag == 0)
-					printf("%-8.8s %5.1Lf %5.1Lf %7.1Lf %7.1Lf %4" PRIu64 " %5.1Lf %3.0Lf ",
-					    devname, transfers_per_second_read,
-					    transfers_per_second_write,
-					    mb_per_second_read * 1024,
-					    mb_per_second_write * 1024,
-					    queue_len,
-					    ms_per_transaction, busy_pct);
+#if defined(SOL_ON)
+				if (sol_format)
+				{
+					SOL_MAP_KEYL(&sol_stream, "device");
+					sol_string(&sol_stream, devname, strlen(devname));
+					if (Iflag == 0) {
+						SOL_MAP_KEYL(&sol_stream, "r/s");
+						sol_float(&sol_stream, transfers_per_second_read);
+						SOL_MAP_KEYL(&sol_stream, "w/s");
+						sol_float(&sol_stream, transfers_per_second_write);
+						SOL_MAP_KEYL(&sol_stream, "kr/s");
+						sol_float(&sol_stream, mb_per_second_read * 1024);
+						SOL_MAP_KEYL(&sol_stream, "kw/s");
+						sol_float(&sol_stream, mb_per_second_write * 1024);
+						SOL_MAP_KEYL(&sol_stream, "qlen");
+						sol_float(&sol_stream, queue_len);
+						SOL_MAP_KEYL(&sol_stream, "svc_t");
+						sol_float(&sol_stream, ms_per_transaction);
+						SOL_MAP_KEYL(&sol_stream, "%b");
+						sol_float(&sol_stream, busy_pct);
+					}
+					else {
+						SOL_MAP_KEYL(&sol_stream, "r/i");
+						sol_float(&sol_stream, total_transfers_read);
+						SOL_MAP_KEYL(&sol_stream, "w/i");
+						sol_float(&sol_stream, total_transfers_write);
+						SOL_MAP_KEYL(&sol_stream, "kr/i");
+						sol_float(&sol_stream, total_bytes_read / 1024);
+						SOL_MAP_KEYL(&sol_stream, "kw/i");
+						sol_float(&sol_stream, total_bytes_write / 1024);
+						SOL_MAP_KEYL(&sol_stream, "qlen");
+						sol_float(&sol_stream, queue_len);
+						SOL_MAP_KEYL(&sol_stream, "tsvc_t/i");
+						sol_float(&sol_stream, total_duration);
+						SOL_MAP_KEYL(&sol_stream, "sb/i");
+						sol_float(&sol_stream, busy_time);
+					}
+
+					if (firstline) {
+						/*
+						 * If this is the first device
+						 * we're printing, also print
+						 * CPU or TTY stats if requested.
+						 */
+						firstline = 0;
+						if (Tflag > 0) {
+							SOL_MAP_KEYL(&sol_stream, "tin");
+							sol_float(&sol_stream, cur.tk_nin / etime);
+							SOL_MAP_KEYL(&sol_stream, "tout");
+							sol_float(&sol_stream, cur.tk_nout / etime);
+						}
+						if (Cflag > 0)
+							cpustats();
+					}
+				}
 				else
-					printf("%-8.8s %11.1Lf %11.1Lf "
-					    "%12.1Lf %12.1Lf %4" PRIu64
-					    " %10.1Lf %9.1Lf ",
-					    devname,
-					    (long double)total_transfers_read,
-					    (long double)total_transfers_write,
-					    (long double)
-					        total_bytes_read / 1024,
-					    (long double)
-					        total_bytes_write / 1024,
-					    queue_len,
-					    total_duration, busy_time);
-				if (firstline) {
-					/*
-					 * If this is the first device
-					 * we're printing, also print
-					 * CPU or TTY stats if requested.
-					 */
-					firstline = 0;
-					if (Tflag > 0)
-						printf("%4.0Lf%5.0Lf",
-						    cur.tk_nin / etime,
-						    cur.tk_nout / etime);
-					if (Cflag > 0)
-						cpustats();
+#endif
+				{
+					if (Iflag == 0)
+						printf("%-8.8s %5.1Lf %5.1Lf %7.1Lf %7.1Lf %4" PRIu64 " %5.1Lf %3.0Lf ",
+							devname, transfers_per_second_read,
+							transfers_per_second_write,
+							mb_per_second_read * 1024,
+							mb_per_second_write * 1024,
+							queue_len,
+							ms_per_transaction, busy_pct);
+					else
+						printf("%-8.8s %11.1Lf %11.1Lf "
+							"%12.1Lf %12.1Lf %4" PRIu64
+							" %10.1Lf %9.1Lf ",
+							devname,
+							(long double)total_transfers_read,
+							(long double)total_transfers_write,
+							(long double)
+								total_bytes_read / 1024,
+							(long double)
+								total_bytes_write / 1024,
+							queue_len,
+							total_duration, busy_time);
+					if (firstline) {
+						/*
+						 * If this is the first device
+						 * we're printing, also print
+						 * CPU or TTY stats if requested.
+						 */
+						firstline = 0;
+						if (Tflag > 0)
+							printf("%4.0Lf%5.0Lf",
+								cur.tk_nin / etime,
+								cur.tk_nout / etime);
+						if (Cflag > 0)
+							cpustats();
+					}
+					printf("\n");
 				}
-				printf("\n");
 			}
 			free(devname);
 		} else if (oflag > 0) {
-			int msdig = (ms_per_transaction < 100.0) ? 1 : 0;
-
-			if (Iflag == 0)
-				printf("%4.0Lf%4.0Lf%5.*Lf ",
-				       blocks_per_second,
-				       transfers_per_second,
-				       msdig,
-				       ms_per_transaction);
+#if defined(SOL_ON)
+			if (sol_format)
+			{
+				if (Iflag == 0) {
+					SOL_MAP_KEYL(&sol_stream, "sps");
+					sol_float(&sol_stream, blocks_per_second);
+					SOL_MAP_KEYL(&sol_stream, "tps");
+					sol_float(&sol_stream, transfers_per_second);
+				}
+				else {
+					SOL_MAP_KEYL(&sol_stream, "blk");
+					sol_float(&sol_stream, total_blocks);
+					SOL_MAP_KEYL(&sol_stream, "xfr");
+					sol_float(&sol_stream, total_transfers);
+				}
+				SOL_MAP_KEYL(&sol_stream, "msps");
+				sol_float(&sol_stream, ms_per_transaction);
+			}
 			else
-				printf("%4.1" PRIu64 "%4.1" PRIu64 "%5.*Lf ",
-				       total_blocks,
-				       total_transfers,
-				       msdig,
-				       ms_per_transaction);
+#endif
+			{
+				int msdig = (ms_per_transaction < 100.0) ? 1 : 0;
+
+				if (Iflag == 0)
+					printf("%4.0Lf%4.0Lf%5.*Lf ",
+						   blocks_per_second,
+						   transfers_per_second,
+						   msdig,
+						   ms_per_transaction);
+				else
+					printf("%4.1" PRIu64 "%4.1" PRIu64 "%5.*Lf ",
+						   total_blocks,
+						   total_transfers,
+						   msdig,
+						   ms_per_transaction);
+			}
 		} else {
-			if (Iflag == 0)
-				printf(" %5.2Lf %3.0Lf %5.2Lf ",
-				       kb_per_transfer,
-				       transfers_per_second,
-				       mb_per_second);
-			else {
-				total_mb = total_bytes;
-				total_mb /= 1024 * 1024;
-
-				printf(" %5.2Lf %3.1" PRIu64 " %5.2Lf ",
-				       kb_per_transfer,
-				       total_transfers,
-				       total_mb);
+#if defined(SOL_ON)
+			if (sol_format)
+			{
+				SOL_MAP_KEYL(&sol_stream, "KB/t");
+				sol_float(&sol_stream, kb_per_transfer);
+
+				if (Iflag == 0) {
+					SOL_MAP_KEYL(&sol_stream, "tps");
+					sol_float(&sol_stream, transfers_per_second);
+					SOL_MAP_KEYL(&sol_stream, "MB/s");
+					sol_float(&sol_stream, mb_per_second);
+				}
+				else {
+					total_mb = total_bytes;
+					total_mb /= 1024 * 1024;
+
+					SOL_MAP_KEYL(&sol_stream, "xfrs");
+					sol_float(&sol_stream, total_transfers);
+					SOL_MAP_KEYL(&sol_stream, "MB");
+					sol_float(&sol_stream, total_mb);
+				}
+			}
+			else
+#endif
+			{
+				if (Iflag == 0)
+					printf(" %5.2Lf %3.0Lf %5.2Lf ",
+						   kb_per_transfer,
+						   transfers_per_second,
+						   mb_per_second);
+				else {
+					total_mb = total_bytes;
+					total_mb /= 1024 * 1024;
+
+					printf(" %5.2Lf %3.1" PRIu64 " %5.2Lf ",
+						   kb_per_transfer,
+						   total_transfers,
+						   total_mb);
+				}
 			}
 		}
 	}
@@ -896,13 +1044,27 @@
 		 * lines I/O because they were all zero,
 		 * print TTY/CPU stats.
 		 */
-		printf("%52s","");
-		if (Tflag > 0)
-			printf("%4.0Lf %5.0Lf", cur.tk_nin / etime,
-			    cur.tk_nout / etime);
-		if (Cflag > 0)
-			cpustats();
-		printf("\n");
+#if defined(SOL_ON)
+		if (sol_format)
+		{
+			SOL_MAP_KEYL(&sol_stream, "tin");
+			sol_float(&sol_stream, cur.tk_nin / etime);
+			SOL_MAP_KEYL(&sol_stream, "tout");
+			sol_float(&sol_stream, cur.tk_nout / etime);
+			if (Cflag > 0)
+				cpustats();
+		}
+		else
+#endif
+		{
+			printf("%52s","");
+			if (Tflag > 0)
+				printf("%4.0Lf %5.0Lf", cur.tk_nin / etime,
+					cur.tk_nout / etime);
+			if (Cflag > 0)
+				cpustats();
+			printf("\n");
+		}
 	}
 }
 
@@ -916,9 +1078,20 @@
 
 	for (state = 0; state < CPUSTATES; ++state)
 		time += cur.cp_time[state];
-	for (state = 0; state < CPUSTATES; ++state)
-		printf(" %2.0f",
-		       rint(100. * cur.cp_time[state] / (time ? time : 1)));
+#if defined(SOL_ON)
+	if (sol_format) {
+		SOL_MAP_KEYL(&sol_stream, "cpu");
+		sol_array_start(&sol_stream);
+		for (state = 0; state < CPUSTATES; ++state)
+			sol_float(&sol_stream,
+				rint(100. * cur.cp_time[state] / (time ? time : 1)));
+		sol_array_end(&sol_stream);
+	}
+	else
+#endif
+		for (state = 0; state < CPUSTATES; ++state)
+			printf(" %2.0f",
+				rint(100. * cur.cp_time[state] / (time ? time : 1)));
 }
 
 static int


More information about the svn-soc-all mailing list