Fix JSON_INTEGER overflow on Windows by changing datatype to 'long long'
[fio.git] / iolog.c
diff --git a/iolog.c b/iolog.c
index 1af31cb3bd30804f4754c48b9f841fd7006736f9..e805eaef9a94595cb5327becf0eb931362179b8a 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -516,9 +516,36 @@ void setup_log(struct io_log **log, unsigned long avg_msec, int log_type)
        *log = l;
 }
 
+#ifdef CONFIG_SETVBUF
+static void *set_file_buffer(FILE *f)
+{
+       size_t size = 1048576;
+       void *buf;
+
+       buf = malloc(size);
+       setvbuf(f, buf, _IOFBF, size);
+       return buf;
+}
+
+static void clear_file_buffer(void *buf)
+{
+       free(buf);
+}
+#else
+static void *set_file_buffer(FILE *f)
+{
+       return NULL;
+}
+
+static void clear_file_buffer(void *buf)
+{
+}
+#endif
+
 void __finish_log(struct io_log *log, const char *name)
 {
        unsigned int i;
+       void *buf;
        FILE *f;
 
        f = fopen(name, "a");
@@ -527,6 +554,8 @@ void __finish_log(struct io_log *log, const char *name)
                return;
        }
 
+       buf = set_file_buffer(f);
+
        for (i = 0; i < log->nr_samples; i++) {
                fprintf(f, "%lu, %lu, %u, %u\n",
                                (unsigned long) log->log[i].time,
@@ -535,6 +564,7 @@ void __finish_log(struct io_log *log, const char *name)
        }
 
        fclose(f);
+       clear_file_buffer(buf);
        free(log->log);
        free(log);
 }
@@ -628,7 +658,6 @@ enum {
        CLAT_LOG_MASK   = 8,
        IOPS_LOG_MASK   = 16,
 
-       ALL_LOG_MASK    = 31,
        ALL_LOG_NR      = 5,
 };
 
@@ -662,7 +691,7 @@ static struct log_type log_types[] = {
 
 void fio_writeout_logs(struct thread_data *td)
 {
-       unsigned int log_mask = ALL_LOG_MASK;
+       unsigned int log_mask = 0;
        unsigned int log_left = ALL_LOG_NR;
        int old_state, i;
 
@@ -677,11 +706,11 @@ void fio_writeout_logs(struct thread_data *td)
                        struct log_type *lt = &log_types[i];
                        int ret;
 
-                       if (log_mask & lt->mask) {
+                       if (!(log_mask & lt->mask)) {
                                ret = lt->fn(td, log_left != 1);
                                if (!ret) {
                                        log_left--;
-                                       log_mask &= ~lt->mask;
+                                       log_mask |= lt->mask;
                                }
                        }
                }