X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=eta.c;h=9111f5ec1e670bfc4177c12e24601795be291efb;hp=087f57d965a015e171cd4478a2da4c5bdb5bdc4c;hb=a6d7953002576946bd7d6703fca698a16ad454a5;hpb=7ad984ef139ed3db955d906e94aa129db3e41655 diff --git a/eta.c b/eta.c index 087f57d9..9111f5ec 100644 --- a/eta.c +++ b/eta.c @@ -2,14 +2,18 @@ * Status and ETA code */ #include -#include #include +#ifdef CONFIG_VALGRIND_DEV +#include +#else +#define DRD_IGNORE_VAR(x) do { } while (0) +#endif #include "fio.h" #include "lib/pow2.h" static char __run_str[REAL_MAX_JOBS + 1]; -static char run_str[__THREAD_RUNSTR_SZ(REAL_MAX_JOBS)]; +static char run_str[__THREAD_RUNSTR_SZ(REAL_MAX_JOBS) + 1]; static void update_condensed_str(char *rstr, char *run_str_condensed) { @@ -145,7 +149,7 @@ void eta_to_str(char *str, unsigned long eta_sec) str += sprintf(str, "%02uh:", h); str += sprintf(str, "%02um:", m); - str += sprintf(str, "%02us", s); + sprintf(str, "%02us", s); } /* @@ -520,7 +524,7 @@ void display_thread_status(struct jobs_eta *je) static int eta_new_line_init, eta_new_line_pending; static int linelen_last; static int eta_good; - char output[REAL_MAX_JOBS + 512], *p = output; + char output[__THREAD_RUNSTR_SZ(REAL_MAX_JOBS) + 512], *p = output; char eta_str[128]; double perc = 0.0; @@ -531,6 +535,7 @@ void display_thread_status(struct jobs_eta *je) if (eta_new_line_pending) { eta_new_line_pending = 0; + linelen_last = 0; p += sprintf(p, "\n"); } @@ -564,6 +569,7 @@ void display_thread_status(struct jobs_eta *je) size_t left; int l; int ddir; + int linelen; if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running || je->eta_sec == -1) @@ -585,7 +591,7 @@ void display_thread_status(struct jobs_eta *je) iops_str[ddir] = num2str(je->iops[ddir], 4, 1, 0, N2S_NONE); } - left = sizeof(output) - (p - output) - 2; + left = sizeof(output) - (p - output) - 1; if (je->rate[DDIR_TRIM] || je->iops[DDIR_TRIM]) l = snprintf(p, left, @@ -601,19 +607,21 @@ void display_thread_status(struct jobs_eta *je) rate_str[DDIR_READ], rate_str[DDIR_WRITE], iops_str[DDIR_READ], iops_str[DDIR_WRITE], eta_str); - if (l > left) - l = left; + /* If truncation occurred adjust l so p is on the null */ + if (l >= left) + l = left - 1; p += l; - if (l >= 0 && l < linelen_last) - p += sprintf(p, "%*s", linelen_last - l, ""); - linelen_last = l; + linelen = p - output; + if (l >= 0 && linelen < linelen_last) + p += sprintf(p, "%*s", linelen_last - linelen, ""); + linelen_last = linelen; for (ddir = 0; ddir < DDIR_RWDIR_CNT; ddir++) { free(rate_str[ddir]); free(iops_str[ddir]); } } - p += sprintf(p, "\r"); + sprintf(p, "\r"); printf("%s", output); @@ -664,6 +672,7 @@ void print_thread_status(void) void print_status_init(int thr_number) { + DRD_IGNORE_VAR(__run_str); __run_str[thr_number] = 'P'; update_condensed_str(__run_str, run_str); }