Merge branch 'master' of https://github.com/bvanassche/fio
[fio.git] / idletime.c
index 90bc1d9eb09fb7a763dcf567e21062ad2320973d..fc1df8e9d009a49059558c6ca576a6e553f304c7 100644 (file)
@@ -1,4 +1,5 @@
 #include <math.h>
+#include "fio.h"
 #include "json.h"
 #include "idletime.h"
 
@@ -185,6 +186,7 @@ void fio_idle_prof_init(void)
        int i, ret;
        struct timespec ts;
        pthread_attr_t tattr;
+       pthread_condattr_t cattr;
        struct idle_prof_thread *ipt;
 
        ipc.nr_cpus = cpus_online();
@@ -193,6 +195,13 @@ void fio_idle_prof_init(void)
        if (ipc.opt == IDLE_PROF_OPT_NONE)
                return;
 
+       ret = pthread_condattr_init(&cattr);
+       assert(ret == 0);
+#ifdef CONFIG_PTHREAD_CONDATTR_SETCLOCK
+       ret = pthread_condattr_setclock(&cattr, CLOCK_MONOTONIC);
+       assert(ret == 0);
+#endif
+
        if ((ret = pthread_attr_init(&tattr))) {
                log_err("fio: pthread_attr_init %s\n", strerror(ret));
                return;
@@ -238,7 +247,7 @@ void fio_idle_prof_init(void)
                        break;
                }
 
-               if ((ret = pthread_cond_init(&ipt->cond, NULL))) {
+               if ((ret = pthread_cond_init(&ipt->cond, &cattr))) {
                        ipc.status = IDLE_PROF_STATUS_ABORT;
                        log_err("fio: pthread_cond_init %s\n", strerror(ret));
                        break;
@@ -281,7 +290,11 @@ void fio_idle_prof_init(void)
                pthread_mutex_lock(&ipt->init_lock);
                while ((ipt->state != TD_EXITED) &&
                       (ipt->state!=TD_INITIALIZED)) {
-                       fio_gettime(&ts, NULL);
+#ifdef CONFIG_PTHREAD_CONDATTR_SETCLOCK
+                       clock_gettime(CLOCK_MONOTONIC, &ts);
+#else
+                       clock_gettime(CLOCK_REALTIME, &ts);
+#endif
                        ts.tv_sec += 1;
                        pthread_cond_timedwait(&ipt->cond, &ipt->init_lock, &ts);
                }
@@ -396,7 +409,7 @@ static double fio_idle_prof_cpu_stat(int cpu)
        return p * 100.0;
 }
 
-static void fio_idle_prof_cleanup(void)
+void fio_idle_prof_cleanup(void)
 {
        if (ipc.ipts) {
                free(ipc.ipts);
@@ -470,10 +483,6 @@ void show_idle_prof_stats(int output, struct json_object *parent,
                        log_buf(out, " stddev=%3.2f\n", ipc.cali_stddev);
                }
 
-               /* dynamic mem allocations can now be freed */
-               if (ipc.opt != IDLE_PROF_OPT_NONE)
-                       fio_idle_prof_cleanup();
-
                return;
        }
 
@@ -497,7 +506,5 @@ void show_idle_prof_stats(int output, struct json_object *parent,
 
                json_object_add_value_float(tmp, "unit_mean", ipc.cali_mean);
                json_object_add_value_float(tmp, "unit_stddev", ipc.cali_stddev);
-               
-               fio_idle_prof_cleanup();
        }
 }