From c580889094284c3786b96761bc1b5d83e24f288c Mon Sep 17 00:00:00 2001
From: "Peter W. Draper" <p.w.draper@durham.ac.uk>
Date: Fri, 4 Mar 2016 18:42:35 +0000
Subject: [PATCH] Be clearer about ms versus ticks

---
 src/clocks.c | 61 ++++++++++++++++++++++++++++++++++++----------------
 src/clocks.h |  1 +
 2 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/src/clocks.c b/src/clocks.c
index 48d52b7c42..2d2cac90dd 100644
--- a/src/clocks.c
+++ b/src/clocks.c
@@ -19,8 +19,10 @@
 
 /**
  *  @file clocks.c
- *  @brief support for measuring intervals in seconds. Use cycle.h
- *  or timers.h for relative times.
+ *  @brief support for measuring intervals in milli seconds, when that
+ *  is possible, otherwise ticks.
+ *
+ *  Use cycle.h or timers.h for relative times.
  */
 
 /* Config parameters. */
@@ -39,6 +41,11 @@
 /* The CPU frequency used to convert ticks to seconds. */
 static unsigned long long clocks_cpufreq = 0;
 
+/* The units of any returned times. */
+static char *clocks_units[] = {"ms", "ticks"};
+static int clocks_units_index = 0;
+static double clocks_units_scale = 1000.0;
+
 /* Local prototypes. */
 static void clocks_estimate_cpufreq();
 
@@ -57,12 +64,12 @@ void clocks_gettime(struct clocks_time *time) {
 }
 
 /**
- * @brief Get difference in milli-seconds between two times.
+ * @brief Get difference in between two times.
  *
  * @param start the start time.
  * @param end the end time.
  *
- * @return the difference in milli-secinds.
+ * @return the difference.
  */
 double clocks_diff(struct clocks_time *start, struct clocks_time *end) {
 #ifdef HAVE_CLOCK_GETTIME
@@ -76,7 +83,7 @@ double clocks_diff(struct clocks_time *start, struct clocks_time *end) {
   }
   return (double)temp.tv_sec * 1000.0 + (double)temp.tv_nsec * 1.0E-6;
 #else
-  return elapsed(end->time, start->time) / clocks_get_cpufreq() * 1000;
+  return elapsed(end->time, start->time) / clocks_get_cpufreq() * clocks_units_scale;
 #endif
 }
 
@@ -117,8 +124,8 @@ unsigned long long clocks_get_cpufreq() {
  *
  * The technique is either use a clock timed nanosleep (this was the best
  * method on i7), to read the value from the cpuinfo_max_freq
- * file (probably a overestimate), to use the macro value CPU_TPS or
- * finally just use a value of 1.
+ * file (probably a overestimate) or finally just use a value of 1 with
+ * time units of ticks.
  */
 static void clocks_estimate_cpufreq() {
 
@@ -143,6 +150,8 @@ static void clocks_estimate_cpufreq() {
 
   clocks_cpufreq =
       (signed long long)(double)(toc - tic) * 1.0 / realsleep * 1000.0;
+  clocks_units_index = 0;
+  clocks_units_scale = 1000.0;
 #endif
 
 /* Look for the system value, if available. Tends to be too large. */
@@ -154,23 +163,24 @@ static void clocks_estimate_cpufreq() {
       unsigned long long maxfreq;
       if (fscanf(file, "%llu", &maxfreq) == 1) {
         clocks_cpufreq = maxfreq * 1000;
+        clocks_units_index = 0;
+        clocks_units_scale = 1000.0;
       }
       fclose(file);
     }
   }
 #endif
 
-/* Nearly final attempt */
-#ifdef CPU_TPS
-  if (clocks_cpufreq == 0) clocks_cpufreq = CPU_TPS;
-#endif
-
   /* If all fails just report ticks in any times. */
-  if (clocks_cpufreq == 0) clocks_cpufreq = 1;
+  if (clocks_cpufreq == 0) {
+    clocks_cpufreq = 1;
+    clocks_units_index = 1;
+    clocks_units_scale = 1.0;
+  }
 }
 
 /**
- * @brief Return the difference between two ticks in seconds.
+ * @brief Return the difference between two ticks.
  *
  * Only an approximation as based on how well we have estimated the
  * rtc frequency. Should be good for machines that support constant_rtc
@@ -179,23 +189,36 @@ static void clocks_estimate_cpufreq() {
  * @param tic a number of ticks returned by the cycle.h getticks() function.
  * @param toc a number of ticks returned by the cycle.h getticks() function.
  *
- * @result the absolute difference in approximated seconds.
+ * @result the difference.
  */
 double clocks_diff_ticks(ticks tic, ticks toc) {
   return clocks_from_ticks(tic - toc);
 }
 
 /**
- * @brief Convert a number of ticks into seconds.
+ * @brief Convert a number of ticks into milli seconds, if possible.
  *
  * Only an approximation as based on how well we have estimated the
  * rtc frequency. Should be good for machines that support constant_rtc
- * and clock_gettime().
+ * and clock_gettime(), and reasonable for most Linux machines, otherwise
+ * ticks will just be returned. See clocks_getunit() for the actual units.
  *
  * @param tics a number of ticks returned by the cycle.h getticks() function.
  *
- * @result the approximated seconds.
+ * @result the milli seconds, if possible.
  */
 double clocks_from_ticks(ticks tics) {
-  return ((double)tics / (double)clocks_get_cpufreq() * 1000.0);
+  return ((double)tics / (double)clocks_get_cpufreq() * clocks_units_scale);
+}
+
+/**
+ * @brief return the time units.
+ *
+ * Normally "ms" for milliseconds, but can be "ticks" when no conversion
+ * factor is available.
+ *
+ * @result the current time units.
+ */
+const char *clocks_getunit() {
+  return clocks_units[clocks_units_index];
 }
diff --git a/src/clocks.h b/src/clocks.h
index a87ab38b0e..59b9f52b03 100644
--- a/src/clocks.h
+++ b/src/clocks.h
@@ -33,6 +33,7 @@ struct clocks_time {
 
 void clocks_gettime(struct clocks_time *time);
 double clocks_diff(struct clocks_time *start, struct clocks_time *end);
+const char *clocks_getunit();
 
 void clocks_set_cpufreq(unsigned long long freq);
 unsigned long long clocks_get_cpufreq();
-- 
GitLab