Recent changes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The following changes since commit 92a3d86ed1b2040c618b296e4d2ce503352792bc:

  Revert "Improvements for num2str()" (2010-09-15 23:05:57 +0200)

are available in the git repository at:
  git://git.kernel.dk/fio.git master

Jens Axboe (6):
      Fixup bad format of replay_no_stall option
      Merge branch 'master' of ssh://router.home.kernel.dk/data/git/fio
      Merge branch 'master' of ssh://router.home.kernel.dk/data/git/fio
      Merge branch 'master' of ssh://router.home.kernel.dk/data/git/fio
      Implement a better num2str()
      num2str fixes

 HOWTO            |   11 +++++----
 Makefile         |    1 +
 Makefile.FreeBSD |    1 +
 Makefile.NetBSD  |    1 +
 Makefile.aix     |    1 +
 Makefile.mac     |    1 +
 Makefile.solaris |    1 +
 fio.h            |   45 +----------------------------------------
 lib/num2str.c    |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 9 files changed, 72 insertions(+), 48 deletions(-)
 create mode 100644 lib/num2str.c

---

Diff of recent changes:

diff --git a/HOWTO b/HOWTO
index 452e288..f338e7d 100644
--- a/HOWTO
+++ b/HOWTO
@@ -988,11 +988,12 @@ read_iolog=str	Open an iolog with the specified file name and replay the
 		file first (blkparse <device> -o /dev/null -d file_for_fio.bin).
 		
 replay_no_stall=int When replaying I/O with read_iolog the default behavior
-		is to attempt to respect the time stamps within the log and replay
-        them with the appropriate delay between IOPS.  By setting this variable
-        fio will not respect the timestamps and attempt to replay them as fast
-        as possible while still respecting ordering.  The result is the same
-        I/O pattern to a given device, but different timings.
+		is to attempt to respect the time stamps within the log and
+		replay them with the appropriate delay between IOPS.  By
+		setting this variable fio will not respect the timestamps and
+		attempt to replay them as fast as possible while still
+		respecting ordering.  The result is the same I/O pattern to a
+		given device, but different timings.
 
 replay_redirect=str While replaying I/O patterns using read_iolog the
 		default behavior is to replay the IOPS onto the major/minor
diff --git a/Makefile b/Makefile
index 13baee8..04cb60f 100644
--- a/Makefile
+++ b/Makefile
@@ -11,6 +11,7 @@ OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
 
 OBJS += lib/rand.o
 OBJS += lib/flist_sort.o
+OBJS += lib/num2str.o
 
 OBJS += crc/crc7.o
 OBJS += crc/crc16.o
diff --git a/Makefile.FreeBSD b/Makefile.FreeBSD
index 5882961..e4adfca 100644
--- a/Makefile.FreeBSD
+++ b/Makefile.FreeBSD
@@ -10,6 +10,7 @@ OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
 
 OBJS += lib/rand.o
 OBJS += lib/flist_sort.o
+OBJS += lib/num2str.o
 
 OBJS += crc/crc7.o
 OBJS += crc/crc16.o
diff --git a/Makefile.NetBSD b/Makefile.NetBSD
index c223ab2..9378b19 100644
--- a/Makefile.NetBSD
+++ b/Makefile.NetBSD
@@ -10,6 +10,7 @@ OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
 
 OBJS += lib/rand.o
 OBJS += lib/flist_sort.o
+OBJS += lib/num2str.o
 
 OBJS += crc/crc7.o
 OBJS += crc/crc16.o
diff --git a/Makefile.aix b/Makefile.aix
index 83b5cf4..32d22a3 100644
--- a/Makefile.aix
+++ b/Makefile.aix
@@ -11,6 +11,7 @@ OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
 
 OBJS += lib/rand.o
 OBJS += lib/getopt_long.o
+OBJS += lib/num2str.o
 
 OBJS += crc/crc7.o
 OBJS += crc/crc16.o
diff --git a/Makefile.mac b/Makefile.mac
index 77e5f03..952364a 100644
--- a/Makefile.mac
+++ b/Makefile.mac
@@ -10,6 +10,7 @@ OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
 
 OBJS += lib/rand.o
 OBJS += lib/flist_sort.o
+OBJS += lib/num2str.o
 
 OBJS += crc/crc7.o
 OBJS += crc/crc16.o
diff --git a/Makefile.solaris b/Makefile.solaris
index 06020c2..e7ff53c 100644
--- a/Makefile.solaris
+++ b/Makefile.solaris
@@ -9,6 +9,7 @@ OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
 
 OBJS += lib/rand.o
 OBJS += lib/flist_sort.o
+OBJS += lib/num2str.o
 
 OBJS += crc/crc7.o
 OBJS += crc/crc16.o
diff --git a/fio.h b/fio.h
index e8c025d..28104cd 100644
--- a/fio.h
+++ b/fio.h
@@ -568,6 +568,8 @@ extern void options_mem_dupe(struct thread_data *);
 extern void options_mem_free(struct thread_data *);
 extern void td_fill_rand_seeds(struct thread_data *);
 extern void add_job_opts(const char **);
+extern char *num2str(unsigned long, int, int, int);
+
 #define FIO_GETOPT_JOB		0x89988998
 #define FIO_NR_OPTIONS		(FIO_MAX_OPTS + 128)
 
@@ -653,49 +655,6 @@ static inline int fio_fill_issue_time(struct thread_data *td)
 	return 0;
 }
 
-/*
- * Cheesy number->string conversion, complete with carry rounding error.
- */
-static inline char *num2str(unsigned long num, int maxlen, int base, int pow2)
-{
-	char postfix[] = { ' ', 'K', 'M', 'G', 'P', 'E' };
-	unsigned int thousand;
-	char *buf;
-	int i;
-
-	if (pow2)
-		thousand = 1024;
-	else
-		thousand = 1000;
-
-	buf = malloc(128);
-
-	for (i = 0; base > 1; i++)
-		base /= thousand;
-
-	do {
-		int len, carry = 0;
-
-		len = sprintf(buf, "%'lu", num);
-		if (len <= maxlen) {
-			if (i >= 1) {
-				buf[len] = postfix[i];
-				buf[len + 1] = '\0';
-			}
-			return buf;
-		}
-
-		if ((num % thousand) >= (thousand / 2))
-			carry = 1;
-
-		num /= thousand;
-		num += carry;
-		i++;
-	} while (i <= 5);
-
-	return buf;
-}
-
 static inline int __should_check_rate(struct thread_data *td,
 				      enum fio_ddir ddir)
 {
diff --git a/lib/num2str.c b/lib/num2str.c
new file mode 100644
index 0000000..559cbeb
--- /dev/null
+++ b/lib/num2str.c
@@ -0,0 +1,58 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * Cheesy number->string conversion, complete with carry rounding error.
+ */
+char *num2str(unsigned long num, int maxlen, int base, int pow2)
+{
+	char postfix[] = { ' ', 'K', 'M', 'G', 'P', 'E' };
+	unsigned int thousand[] = { 1000, 1024 };
+	unsigned int modulo, decimals;
+	int post_index, carry = 0;
+	char tmp[32];
+	char *buf;
+
+	buf = malloc(128);
+
+	for (post_index = 0; base > 1; post_index++)
+		base /= thousand[!!pow2];
+
+	modulo = -1U;
+	while (post_index < sizeof(postfix)) {
+		sprintf(tmp, "%lu", num);
+		if (strlen(tmp) <= maxlen)
+			break;
+
+		modulo = num % thousand[!!pow2];
+		num /= thousand[!!pow2];
+		carry = modulo >= thousand[!!pow2] / 2;
+		post_index++;
+	}
+
+	if (modulo == -1U) {
+done:
+		sprintf(buf, "%lu%c", num, postfix[post_index]);
+		return buf;
+	}
+
+	sprintf(tmp, "%lu", num);
+	decimals = maxlen - strlen(tmp);
+	if (decimals <= 1) {
+		if (carry)
+			num++;
+		goto done;
+	}
+
+	do {
+		sprintf(tmp, "%u", modulo);
+		if (strlen(tmp) <= decimals - 1)
+			break;
+
+		modulo = (modulo + 9) / 10;
+	} while (1);
+
+	sprintf(buf, "%lu.%u%c", num, modulo, postfix[post_index]);
+	return buf;
+}
--
To unsubscribe from this list: send the line "unsubscribe fio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel]     [Linux SCSI]     [Linux IDE]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux