btrace2fio: set runtime
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index 58744a82e7e1eafbdbf1e12dc3717a5ca8cffd60..89d719468cd91aed185a3491e08cb1a1fe7d8313 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -1169,7 +1169,7 @@ void init_thread_stat(struct thread_stat *ts)
        ts->groupid = -1;
 }
 
-static void __show_run_stats(void)
+void __show_run_stats(void)
 {
        struct group_run_stats *runstats, *rs;
        struct thread_data *td;
@@ -1411,13 +1411,15 @@ void show_run_stats(void)
        fio_mutex_up(stat_mutex);
 }
 
-static void *__show_running_run_stats(void fio_unused *arg)
+static void *__show_running_run_stats(void *arg)
 {
        struct thread_data *td;
        unsigned long long *rt;
        struct timeval tv;
        int i;
 
+       fio_mutex_down(stat_mutex);
+
        rt = malloc(thread_number * sizeof(unsigned long long));
        fio_gettime(&tv, NULL);
 
@@ -1458,6 +1460,7 @@ static void *__show_running_run_stats(void fio_unused *arg)
 
        free(rt);
        fio_mutex_up(stat_mutex);
+       free(arg);
        return NULL;
 }
 
@@ -1468,21 +1471,23 @@ static void *__show_running_run_stats(void fio_unused *arg)
  */
 void show_running_run_stats(void)
 {
-       pthread_t thread;
+       pthread_t *thread;
 
-       fio_mutex_down(stat_mutex);
+       thread = calloc(1, sizeof(*thread));
+       if (!thread)
+               return;
 
-       if (!pthread_create(&thread, NULL, __show_running_run_stats, NULL)) {
+       if (!pthread_create(thread, NULL, __show_running_run_stats, thread)) {
                int err;
 
-               err = pthread_detach(thread);
+               err = pthread_detach(*thread);
                if (err)
                        log_err("fio: DU thread detach failed: %s\n", strerror(err));
 
                return;
        }
 
-       fio_mutex_up(stat_mutex);
+       free(thread);
 }
 
 static int status_interval_init;
@@ -1565,7 +1570,7 @@ static void __add_log_sample(struct io_log *iolog, unsigned long val,
                             enum fio_ddir ddir, unsigned int bs,
                             unsigned long t, uint64_t offset)
 {
-       const int nr_samples = iolog->nr_samples;
+       uint64_t nr_samples = iolog->nr_samples;
        struct io_sample *s;
 
        if (iolog->disabled)
@@ -1579,21 +1584,31 @@ static void __add_log_sample(struct io_log *iolog, unsigned long val,
                void *new_log;
 
                new_size = 2 * iolog->max_samples * log_entry_sz(iolog);
-               new_log = realloc(iolog->log, new_size);
-               if (!new_log) {
-                       log_err("fio: failed extending iolog! Will stop logging.\n");
-                       iolog->disabled = 1;
-                       return;
+
+               if (iolog->log_gz && (new_size > iolog->log_gz)) {
+                       if (iolog_flush(iolog, 0)) {
+                               log_err("fio: failed flushing iolog! Will stop logging.\n");
+                               iolog->disabled = 1;
+                               return;
+                       }
+                       nr_samples = iolog->nr_samples;
+               } else {
+                       new_log = realloc(iolog->log, new_size);
+                       if (!new_log) {
+                               log_err("fio: failed extending iolog! Will stop logging.\n");
+                               iolog->disabled = 1;
+                               return;
+                       }
+                       iolog->log = new_log;
+                       iolog->max_samples <<= 1;
                }
-               iolog->log = new_log;
-               iolog->max_samples <<= 1;
        }
 
        s = get_sample(iolog, nr_samples);
 
        s->val = val;
        s->time = t;
-       s->ddir = ddir;
+       io_sample_set_ddir(iolog, s, ddir);
        s->bs = bs;
 
        if (iolog->log_offset) {