From 90be05ea066850842c6445f8432df6f260ea75fb Mon Sep 17 00:00:00 2001
From: Arnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Date: Fri, 6 May 2011 11:42:40 +0200
Subject: [PATCH 1/1] timestamp: add possibility to choose clock type.

---
 main.cpp |  2 +-
 timer.h  | 42 ++++++++++++++++++++++++++++++------------
 2 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/main.cpp b/main.cpp
index 102122d..91e08a2 100644
--- a/main.cpp
+++ b/main.cpp
@@ -166,7 +166,7 @@ int main(int argc, char* argv[])
     // Note: variables used after THROW must be declared as volatile.
     volatile int exit_status = 0;   // global exit status
     volatile double simulated_time = -1.0;
-    timestamp simulation_time;
+    timestamp simulation_time(timestamp::cpu_time);
     xbt_ex_t ex;
     MSG_error_t res;
 
diff --git a/timer.h b/timer.h
index ccb115b..b9a2509 100644
--- a/timer.h
+++ b/timer.h
@@ -51,7 +51,9 @@ struct timeval operator-(const struct timeval& a, const struct timeval& b)
 
 class timestamp {
 public:
-    timestamp();
+    enum clock_type { wallclock_time, cpu_time };
+
+    timestamp(clock_type ct);
     ~timestamp();
     void reset();
 
@@ -62,16 +64,19 @@ public:
     double duration() const;
 
 private:
-    struct rusage before;
-    struct rusage after;
+    clock_type clk;
+    struct timeval before;
+    struct timeval after;
     struct timeval difference;
 
+    void get_time(struct timeval& tv);
+
     static void tv_clear(struct timeval& a);
     static double timertod(const struct timeval& a);
 };
 
 inline
-timestamp::timestamp()
+timestamp::timestamp(clock_type ct): clk(ct)
 {
     reset();
 }
@@ -84,25 +89,22 @@ timestamp::~timestamp()
 inline
 void timestamp::reset()
 {
-    tv_clear(before.ru_utime);
-    tv_clear(before.ru_stime);
-    tv_clear(after.ru_utime);
-    tv_clear(after.ru_stime);
+    tv_clear(before);
+    tv_clear(after);
     tv_clear(difference);
 }
 
 inline
 void timestamp::start()
 {
-    getrusage(RUSAGE_SELF, &before);
+    get_time(before);
 }
 
 inline
 void timestamp::stop()
 {
-    getrusage(RUSAGE_SELF, &after);
-    difference = difference + ((after.ru_utime + after.ru_stime) -
-                               (before.ru_utime + before.ru_stime));
+    get_time(after);
+    difference = difference + (after - before);
 }
 
 inline
@@ -117,6 +119,22 @@ double timestamp::duration() const
     return timertod(difference);
 }
 
+inline
+void timestamp::get_time(struct timeval& tv)
+{
+    switch (clk) {
+    case cpu_time: {
+        struct rusage usage;
+        getrusage(RUSAGE_SELF, &usage);
+        tv = usage.ru_utime + usage.ru_stime;
+        break;
+    }
+    case wallclock_time:
+        gettimeofday(&tv, NULL);
+        break;
+    }
+}
+
 inline
 void timestamp::tv_clear(struct timeval& a)
 {
-- 
2.39.5