Signed-off-by: Jens Axboe <axboe@fb.com>
* fill_device option is set.
*/
td_clear_error(td);
* fill_device option is set.
*/
td_clear_error(td);
+ fio_mark_td_terminate(td);
if (runtime_exceeded(td, &td->tv_cache)) {
__update_tv_cache(td);
if (runtime_exceeded(td, &td->tv_cache)) {
if (runtime_exceeded(td, &td->tv_cache)) {
__update_tv_cache(td);
if (runtime_exceeded(td, &td->tv_cache)) {
+ fio_mark_td_terminate(td);
if (runtime_exceeded(td, &td->tv_cache)) {
__update_tv_cache(td);
if (runtime_exceeded(td, &td->tv_cache)) {
if (runtime_exceeded(td, &td->tv_cache)) {
__update_tv_cache(td);
if (runtime_exceeded(td, &td->tv_cache)) {
+ fio_mark_td_terminate(td);
if (td->o.fill_device && td->error == ENOSPC) {
td->error = 0;
if (td->o.fill_device && td->error == ENOSPC) {
td->error = 0;
+ fio_mark_td_terminate(td);
}
if (!td->error) {
struct fio_file *f;
}
if (!td->error) {
struct fio_file *f;
#define TERMINATE_ALL (-1)
extern void fio_terminate_threads(int);
#define TERMINATE_ALL (-1)
extern void fio_terminate_threads(int);
+extern void fio_mark_td_terminate(struct thread_data *);
td_set_runstate(td, old_state);
}
td_set_runstate(td, old_state);
}
+void fio_mark_td_terminate(struct thread_data *td)
+{
+ fio_gettime(&td->terminate_time, NULL);
+ write_barrier();
+ td->terminate = 1;
+}
+
void fio_terminate_threads(int group_id)
{
struct thread_data *td;
void fio_terminate_threads(int group_id)
{
struct thread_data *td;
if (td->terminate)
continue;
if (td->terminate)
continue;
+ fio_mark_td_terminate(td);
- fio_gettime(&td->terminate_time, NULL);
/*
* if the thread is running, just let it exit
/*
* if the thread is running, just let it exit
done:
if (ret && td->o.verify_fatal)
done:
if (ret && td->o.verify_fatal)
+ fio_mark_td_terminate(td);
if (ret) {
td_verror(td, ret, "async_verify");
if (td->o.verify_fatal)
if (ret) {
td_verror(td, ret, "async_verify");
if (td->o.verify_fatal)
+ fio_mark_td_terminate(td);