Refactor for_each_td() to catch inappropriate td ptr reuse
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index 776fb51f74208cc67945c6e2527da9dcf5c53c78..325355174bd37c1134bb3d492a3f4aecee5e10c7 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -258,6 +258,7 @@ struct thread_data {
 
        struct frand_state bsrange_state[DDIR_RWDIR_CNT];
        struct frand_state verify_state;
+       struct frand_state verify_state_last_do_io;
        struct frand_state trim_state;
        struct frand_state delay_state;
 
@@ -356,6 +357,7 @@ struct thread_data {
         * Issue side
         */
        uint64_t io_issues[DDIR_RWDIR_CNT];
+       uint64_t verify_read_issues;
        uint64_t io_issue_bytes[DDIR_RWDIR_CNT];
        uint64_t loops;
 
@@ -370,6 +372,7 @@ struct thread_data {
        uint64_t zone_bytes;
        struct fio_sem *sem;
        uint64_t bytes_done[DDIR_RWDIR_CNT];
+       uint64_t bytes_verified;
 
        uint64_t *thinktime_blocks_counter;
        struct timespec last_thinktime;
@@ -431,10 +434,12 @@ struct thread_data {
        FILE *io_log_rfile;
        unsigned int io_log_blktrace;
        unsigned int io_log_blktrace_swap;
-       unsigned long long io_log_blktrace_last_ttime;
+       unsigned long long io_log_last_ttime;
+       struct timespec io_log_start_time;
        unsigned int io_log_current;
        unsigned int io_log_checkmark;
        unsigned int io_log_highmark;
+       unsigned int io_log_version;
        struct timespec io_log_highmark_time;
 
        /*
@@ -748,9 +753,24 @@ extern void lat_target_reset(struct thread_data *);
 
 /*
  * Iterates all threads/processes within all the defined jobs
+ * Usage:
+ *             for_each_td(var_name_for_td) {
+ *                     << bodoy of your loop >>
+ *                      Note: internally-scoped loop index availble as __td_index
+ *             } end_for_each_td()
  */
-#define for_each_td(td, i)     \
-       for ((i) = 0, (td) = &segments[0].threads[0]; (i) < (int) thread_number; (i)++, (td) = tnumber_to_td((i)))
+#define for_each_td(td)                        \
+{                                                              \
+       int __td_index;                         \
+       struct thread_data *(td);       \
+       for (__td_index = 0, (td) = &segments[0].threads[0];\
+               __td_index < (int) thread_number; __td_index++, (td) = tnumber_to_td(__td_index))
+#define for_each_td_index()        \
+{                                                              \
+       int __td_index;                         \
+       for (__td_index = 0; __td_index < (int) thread_number; __td_index++)
+#define        end_for_each()  }
+
 #define for_each_file(td, f, i)        \
        if ((td)->files_index)                                          \
                for ((i) = 0, (f) = (td)->files[0];                     \