Fixup some of the time (usec) based conversions
[fio.git] / eta.c
diff --git a/eta.c b/eta.c
index 52c17282e89ce53e96ac7c43bc64117003224814..5be5aed3bcc3a6bb397a06dc6314eb5652d66fbf 100644 (file)
--- a/eta.c
+++ b/eta.c
@@ -8,47 +8,26 @@
 #include "fio.h"
 
 static char __run_str[REAL_MAX_JOBS + 1];
+static char run_str[__THREAD_RUNSTR_SZ(REAL_MAX_JOBS)];
 
-/*
- * Worst level condensing would be 1:4, so allow enough room for that
- */
-static char run_str[(4 * REAL_MAX_JOBS) + 1];
-
-static void update_condensed_str(char *run_str, char *run_str_condensed)
+static void update_condensed_str(char *rstr, char *run_str_condensed)
 {
-       int i, ci, last, nr;
-       size_t len;
-
-       len = strlen(run_str);
-       if (!len)
-               return;
-
-       last = 0;
-       nr = 0;
-       ci = 0;
-       for (i = 0; i < len; i++) {
-               if (!last) {
-new:
-                       run_str_condensed[ci] = run_str[i];
-                       last = run_str[i];
-                       nr = 1;
-                       ci++;
-               } else if (last == run_str[i]) {
-                       nr++;
-               } else {
-                       int elen;
-
-                       elen = sprintf(&run_str_condensed[ci], "(%u),", nr);
-                       ci += elen;
-                       goto new;
+       if (*rstr) {
+               while (*rstr) {
+                       int nr = 1;
+
+                       *run_str_condensed++ = *rstr++;
+                       while (*(rstr - 1) == *rstr) {
+                               rstr++;
+                               nr++;
+                       }
+                       run_str_condensed += sprintf(run_str_condensed, "(%u),", nr);
                }
+               run_str_condensed--;
        }
-
-       if (nr)
-               sprintf(&run_str_condensed[ci], "(%u)", nr);
+       *run_str_condensed = '\0';
 }
 
-
 /*
  * Sets the status of the 'td' in the printed status map.
  */
@@ -255,11 +234,11 @@ static int thread_eta(struct thread_data *td)
                 * if given, otherwise assume it'll run at the specified rate.
                 */
                if (td->o.timeout) {
-                       uint64_t timeout = td->o.timeout;
+                       uint64_t __timeout = td->o.timeout;
                        uint64_t start_delay = td->o.start_delay;
                        uint64_t ramp_time = td->o.ramp_time;
 
-                       t_eta = timeout + start_delay + ramp_time;
+                       t_eta = __timeout + start_delay + ramp_time;
                        t_eta /= 1000000ULL;
 
                        if (in_ramp_time(td)) {
@@ -413,10 +392,9 @@ int calc_thread_status(struct jobs_eta *je, int force)
                } else if (td->runstate == TD_RAMP) {
                        je->nr_running++;
                        je->nr_ramp++;
-               } else if (td->runstate == TD_SETTING_UP) {
-                       je->nr_running++;
+               } else if (td->runstate == TD_SETTING_UP)
                        je->nr_setting_up++;
-               else if (td->runstate < TD_RUNNING)
+               else if (td->runstate < TD_RUNNING)
                        je->nr_pending++;
 
                if (je->elapsed_sec >= 3)
@@ -487,7 +465,8 @@ int calc_thread_status(struct jobs_eta *je, int force)
                return 0;
 
        je->nr_threads = thread_number;
-       memcpy(je->run_str, run_str, thread_number * sizeof(char));
+       update_condensed_str(__run_str, run_str);
+       memcpy(je->run_str, run_str, strlen(run_str));
        return 1;
 }
 
@@ -576,8 +555,7 @@ void display_thread_status(struct jobs_eta *je)
        if (!eta_new_line_init) {
                fio_gettime(&disp_eta_new_line, NULL);
                eta_new_line_init = 1;
-       } else if (eta_new_line &&
-                  mtime_since_now(&disp_eta_new_line) > eta_new_line * 1000) {
+       } else if (eta_new_line && mtime_since_now(&disp_eta_new_line) > eta_new_line) {
                fio_gettime(&disp_eta_new_line, NULL);
                eta_new_line_pending = 1;
        }
@@ -585,19 +563,33 @@ void display_thread_status(struct jobs_eta *je)
        fflush(stdout);
 }
 
-void print_thread_status(void)
+struct jobs_eta *get_jobs_eta(int force, size_t *size)
 {
        struct jobs_eta *je;
-       size_t size;
 
        if (!thread_number)
-               return;
+               return NULL;
+
+       *size = sizeof(*je) + THREAD_RUNSTR_SZ;
+       je = malloc(*size);
+       memset(je, 0, *size);
+
+       if (!calc_thread_status(je, 0)) {
+               free(je);
+               return NULL;
+       }
+
+       *size = sizeof(*je) + strlen((char *) je->run_str) + 1;
+       return je;
+}
 
-       size = sizeof(*je) + thread_number * sizeof(char) + 1;
-       je = malloc(size);
-       memset(je, 0, size);
+void print_thread_status(void)
+{
+       struct jobs_eta *je;
+       size_t size;
 
-       if (calc_thread_status(je, 0))
+       je = get_jobs_eta(0, &size);
+       if (je)
                display_thread_status(je);
 
        free(je);