* fill_device option is set.
*/
td_clear_error(td);
- td->terminate = 1;
+ fio_mark_td_terminate(td);
return 1;
} else {
/*
if (runtime_exceeded(td, &td->tv_cache)) {
__update_tv_cache(td);
if (runtime_exceeded(td, &td->tv_cache)) {
- td->terminate = 1;
+ fio_mark_td_terminate(td);
break;
}
}
if (runtime_exceeded(td, &td->tv_cache)) {
__update_tv_cache(td);
if (runtime_exceeded(td, &td->tv_cache)) {
- td->terminate = 1;
+ fio_mark_td_terminate(td);
break;
}
}
if (td->o.fill_device && td->error == ENOSPC) {
td->error = 0;
- td->terminate = 1;
+ fio_mark_td_terminate(td);
}
if (!td->error) {
struct fio_file *f;
#define TERMINATE_ALL (-1)
extern void fio_terminate_threads(int);
+extern void fio_mark_td_terminate(struct thread_data *);
/*
* Memory helpers
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;
if (td->terminate)
continue;
- td->terminate = 1;
+ fio_mark_td_terminate(td);
td->o.start_delay = 0;
- fio_gettime(&td->terminate_time, NULL);
/*
* if the thread is running, just let it exit
done:
if (ret && td->o.verify_fatal)
- td->terminate = 1;
+ fio_mark_td_terminate(td);
return ret;
}
if (ret) {
td_verror(td, ret, "async_verify");
if (td->o.verify_fatal)
- td->terminate = 1;
+ fio_mark_td_terminate(td);
}
done: