Similar to for_each_file(), just iterates over each td we know about.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
{
unsigned long elapsed = mtime_since_genesis() / 1000;
int i, nr_running, nr_pending, t_rate, m_rate, *eta_secs, eta_sec;
+ struct thread_data *td;
char eta_str[32];
double perc = 0.0;
memset(eta_secs, 0, thread_number * sizeof(int));
nr_pending = nr_running = t_rate = m_rate = 0;
- for (i = 0; i < thread_number; i++) {
- struct thread_data *td = &threads[i];
-
+ for_each_td(td, i) {
if (td->runstate == TD_RUNNING || td->runstate == TD_VERIFYING||
td->runstate == TD_FSYNCING) {
nr_running++;
else
eta_sec = 0;
- for (i = 0; i < thread_number; i++) {
+ for_each_td(td, i) {
if (exitall_on_terminate) {
if (eta_secs[i] < eta_sec)
eta_sec = eta_secs[i];
static void terminate_threads(int group_id)
{
+ struct thread_data *td;
int i;
- for (i = 0; i < thread_number; i++) {
- struct thread_data *td = &threads[i];
-
+ for_each_td(td, i) {
if (group_id == TERMINATE_ALL || groupid == td->groupid) {
td->terminate = 1;
td->start_delay = 0;
*/
static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
{
+ struct thread_data *td;
int i, cputhreads;
/*
* reap exited threads (TD_EXITED -> TD_REAPED)
*/
- for (i = 0, cputhreads = 0; i < thread_number; i++) {
- struct thread_data *td = &threads[i];
-
+ cputhreads = 0;
+ for_each_td(td, i) {
/*
* ->io_ops is NULL for a thread that has closed its
* io engine
nr_started = 0;
m_rate = t_rate = 0;
- for (i = 0; i < thread_number; i++) {
- td = &threads[i];
-
+ for_each_td(td, i) {
print_status_init(td->thread_number - 1);
init_disk_util(td);
/*
* create threads (TD_NOT_CREATED -> TD_CREATED)
*/
- for (i = 0; i < thread_number; i++) {
- td = &threads[i];
-
+ for_each_td(td, i) {
if (td->runstate != TD_NOT_CREATED)
continue;
/*
* start created threads (TD_INITIALIZED -> TD_RUNNING).
*/
- for (i = 0; i < thread_number; i++) {
- td = &threads[i];
-
+ for_each_td(td, i) {
if (td->runstate != TD_INITIALIZED)
continue;
*/
#define fio_unused __attribute((__unused__))
+#define for_each_td(td, i) \
+ for ((i) = 0, (td) = &threads[0]; (i) < (int) thread_number; (i)++, (td)++)
#define for_each_file(td, f, i) \
- for ((i) = 0, (f) = &(td)->files[0]; (i) < (int) (td)->nr_files; (i)++, (f) = &(td)->files[(i)])
+ for ((i) = 0, (f) = &(td)->files[0]; (i) < (int) (td)->nr_files; (i)++, (f)++)
#endif
rs->min_bw[1] = rs->min_run[1] = ~0UL;
}
- for (i = 0; i < thread_number; i++) {
+ for_each_td(td, i) {
unsigned long long rbw, wbw;
- td = &threads[i];
-
if (td->error) {
fprintf(f_out, "%s: %s\n", td->name, td->verror);
continue;
if (!terse_output)
printf("\n");
- for (i = 0; i < thread_number; i++) {
- td = &threads[i];
+ for_each_td(td, i) {
rs = &runstats[td->groupid];
if (terse_output)