#include "fio.h"
static char __run_str[REAL_MAX_JOBS + 1];
-
-/*
- * Worst level condensing would be 1:5, so allow enough room for that
- */
static char run_str[__THREAD_RUNSTR_SZ(REAL_MAX_JOBS)];
static void update_condensed_str(char *run_str, 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 {
- ci += sprintf(&run_str_condensed[ci], "(%u),", nr);
- goto new;
+ 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--;
}
-
- if (nr)
- ci += sprintf(&run_str_condensed[ci], "(%u)", nr);
-
- run_str_condensed[ci + 1] = '\0';
+ *run_str_condensed = '\0';
}
/*
} 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)
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_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;
+}
+
+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);