X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=idletime.c;h=fc1df8e9d009a49059558c6ca576a6e553f304c7;hb=2fbe1e195999e23c95b08d03eadac0b5f95330e7;hp=90bc1d9eb09fb7a763dcf567e21062ad2320973d;hpb=8b6a404cdd2c40715885e562416c3db039912773;p=fio.git diff --git a/idletime.c b/idletime.c index 90bc1d9e..fc1df8e9 100644 --- a/idletime.c +++ b/idletime.c @@ -1,4 +1,5 @@ #include +#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(); } }