We should not terminate threads that haven't been started yet.
The fsync check was bad, it should look at td->error.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
usec_sleep(td, td->thinktime);
}
usec_sleep(td, td->thinktime);
}
if (td->cur_depth)
cleanup_pending_aio(td);
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;
static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
{
struct thread_data *td;
+ int i, cputhreads, pending;
/*
* reap exited threads (TD_EXITED -> TD_REAPED)
*/
/*
* reap exited threads (TD_EXITED -> TD_REAPED)
*/
+ pending = cputhreads = 0;
for_each_td(td, i) {
/*
* ->io_ops is NULL for a thread that has closed its
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->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++;
+
td_set_runstate(td, TD_REAPED);
td_set_runstate(td, TD_REAPED);
- if (*nr_running == cputhreads)
+ if (*nr_running == cputhreads && !pending)
terminate_threads(TERMINATE_ALL);
}
terminate_threads(TERMINATE_ALL);
}