#include "fio.h"
-static char run_str[REAL_MAX_JOBS + 1];
+static char __run_str[REAL_MAX_JOBS + 1];
+static char run_str[__THREAD_RUNSTR_SZ(REAL_MAX_JOBS)];
+
+static void update_condensed_str(char *run_str, char *run_str_condensed)
+{
+ if (*run_str) {
+ while (*run_str) {
+ int nr = 1;
+
+ *run_str_condensed++ = *run_str++;
+ while (*(run_str - 1) == *run_str) {
+ run_str++;
+ nr++;
+ }
+ run_str_condensed += sprintf(run_str_condensed, "(%u),", nr);
+ }
+ run_str_condensed--;
+ }
+ *run_str_condensed = '\0';
+}
/*
* Sets the status of the 'td' in the printed status map.
*/
static void check_str_update(struct thread_data *td)
{
- char c = run_str[td->thread_number - 1];
+ char c = __run_str[td->thread_number - 1];
switch (td->runstate) {
case TD_REAPED:
log_err("state %d\n", td->runstate);
}
- run_str[td->thread_number - 1] = c;
+ __run_str[td->thread_number - 1] = c;
+ update_condensed_str(__run_str, run_str);
}
/*
double perc, perc_t;
bytes_done = ddir_rw_sum(td->io_bytes);
- perc = (double) bytes_done / (double) bytes_total;
- if (perc > 1.0)
- perc = 1.0;
+
+ if (bytes_total) {
+ perc = (double) bytes_done / (double) bytes_total;
+ if (perc > 1.0)
+ perc = 1.0;
+ } else
+ perc = 0.0;
if (td->o.time_based) {
- perc_t = (double) elapsed / (double) timeout;
- if (perc_t < perc)
- perc = perc_t;
+ if (timeout) {
+ perc_t = (double) elapsed / (double) timeout;
+ if (perc_t < perc)
+ perc = perc_t;
+ } else {
+ /*
+ * Will never hit, we can't have time_based
+ * without a timeout set.
+ */
+ perc = 0.0;
+ }
}
eta_sec = (unsigned long) (elapsed * (1.0 / perc)) - elapsed;
} 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)
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;
}
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);
- size = sizeof(*je) + thread_number * sizeof(char) + 1;
- 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;
+}
+
+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);
void print_status_init(int thr_number)
{
- run_str[thr_number] = 'P';
+ __run_str[thr_number] = 'P';
+ update_condensed_str(__run_str, run_str);
}