X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.c;h=c2bc1a67625f0d7b991486143dd6bc385472ac78;hp=355d8730862643eb02aff27a90d56f1188818572;hb=f85ac25a7d5c9d5ba4d5c73363a6a2a461a9b013;hpb=ad830ed7386eff264bdb5189675d6dfa672bd16b diff --git a/fio.c b/fio.c index 355d8730..c2bc1a67 100644 --- a/fio.c +++ b/fio.c @@ -49,7 +49,7 @@ int nr_thread = 0; int shm_id = 0; int temp_stall_ts; -static struct fio_sem *startup_sem; +static struct fio_mutex *startup_mutex; static volatile int fio_abort; static int exit_value; @@ -82,8 +82,12 @@ static void terminate_threads(int group_id) */ if (td->runstate < TD_RUNNING) kill(td->pid, SIGQUIT); - else if (td->io_ops->flags & FIO_SIGQUIT) - kill(td->pid, SIGQUIT); + else { + struct ioengine_ops *ops = td->io_ops; + + if (ops && (ops->flags & FIO_SIGQUIT)) + kill(td->pid, SIGQUIT); + } } } } @@ -355,7 +359,6 @@ static void do_verify(struct thread_data *td) io_u->xfer_buflen = io_u->resid; io_u->xfer_buf += bytes; io_u->offset += bytes; - f->last_completed_pos = io_u->offset; td->ts.short_io_u[io_u->ddir]++; @@ -481,7 +484,6 @@ static void do_io(struct thread_data *td) io_u->xfer_buflen = io_u->resid; io_u->xfer_buf += bytes; io_u->offset += bytes; - f->last_completed_pos = io_u->offset; td->ts.short_io_u[io_u->ddir]++; @@ -783,8 +785,7 @@ static int clear_io_state(struct thread_data *td) if (td->o.time_based || td->o.loops) td->nr_done_files = 0; - for_each_file(td, f, i) - td_io_close_file(td, f); + close_files(td); ret = 0; for_each_file(td, f, i) { @@ -822,14 +823,14 @@ static void *thread_main(void *data) td->io_hist_tree = RB_ROOT; td_set_runstate(td, TD_INITIALIZED); - fio_sem_up(startup_sem); - fio_sem_down(td->mutex); + fio_mutex_up(startup_mutex); + fio_mutex_down(td->mutex); /* - * the ->mutex semaphore is now no longer used, close it to avoid + * the ->mutex mutex is now no longer used, close it to avoid * eating a file descriptor */ - fio_sem_remove(td->mutex); + fio_mutex_remove(td->mutex); /* * May alter parameters that init_io_u() will use, so we need to @@ -962,7 +963,7 @@ static void *thread_main(void *data) err: if (td->error) printf("fio: pid=%d, err=%d/%s\n", td->pid, td->error, td->verror); - close_files(td); + close_and_free_files(td); close_ioengine(td); cleanup_io_u(td); @@ -1024,7 +1025,11 @@ static void reap_threads(int *nr_running, int *t_rate, int *m_rate) else realthreads++; - if (!td->pid || td->runstate == TD_REAPED) + if (!td->pid) { + pending++; + continue; + } + if (td->runstate == TD_REAPED) continue; if (td->o.use_thread) { if (td->runstate == TD_EXITED) { @@ -1209,7 +1214,7 @@ static void run_threads(void) exit(ret); } } - fio_sem_down(startup_sem); + fio_mutex_down(startup_mutex); } /* @@ -1264,7 +1269,7 @@ static void run_threads(void) m_rate += td->o.ratemin; t_rate += td->o.rate; todo--; - fio_sem_up(td->mutex); + fio_mutex_up(td->mutex); } reap_threads(&nr_running, &t_rate, &m_rate); @@ -1313,7 +1318,7 @@ int main(int argc, char *argv[]) setup_log(&agg_io_log[DDIR_WRITE]); } - startup_sem = fio_sem_init(0); + startup_mutex = fio_mutex_init(0); set_genesis_time(); @@ -1329,6 +1334,6 @@ int main(int argc, char *argv[]) } } - fio_sem_remove(startup_sem); + fio_mutex_remove(startup_mutex); return exit_value; }