int thread_number = 0;
int shm_id = 0;
int temp_stall_ts;
-char *fio_inst_prefix = _INST_PREFIX;
+const char *fio_inst_prefix = _INST_PREFIX;
static volatile int startup_sem;
rate_throttle(td, usec, icd.bytes_done[td->ddir], td->ddir);
if (check_min_rate(td, &e)) {
- if (rate_quit)
+ if (exitall_on_terminate)
terminate_threads(td->groupid);
td_verror(td, ENOMEM);
break;
usec_sleep(td, td->thinktime);
}
- if (!ret) {
+ if (!td->error) {
if (td->cur_depth)
cleanup_pending_aio(td);
static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
{
struct thread_data *td;
- int i, cputhreads;
+ int i, cputhreads, pending;
/*
* reap exited threads (TD_EXITED -> TD_REAPED)
*/
- cputhreads = 0;
+ pending = cputhreads = 0;
for_each_td(td, i) {
/*
* ->io_ops is NULL for a thread that has closed its
if (td->io_ops && td->io_ops->flags & FIO_CPUIO)
cputhreads++;
- if (td->runstate != TD_EXITED)
+ if (td->runstate != TD_EXITED) {
+ if (td->runstate < TD_RUNNING)
+ pending++;
+
continue;
+ }
td_set_runstate(td, TD_REAPED);
(*t_rate) -= td->rate;
}
- if (*nr_running == cputhreads)
+ if (*nr_running == cputhreads && !pending)
terminate_threads(TERMINATE_ALL);
}