Remove another chunck of Pandora.
[m6w6/libmemcached] / libtest / timer.hpp
index 37da32f1af1e9ad99086da3faae060b54d4673ae..eac5194036300a533dfabfbf14f4fd4f9a8adc61 100644 (file)
 
 #pragma once
 
+#include <cstdlib>
 #include <ctime>
-#include <ostream>
+#include <iostream>
 
 #ifdef __MACH__
 #  include <mach/clock.h>
 #  include <mach/mach.h>
 #else
+#  include <time.h>
 #  include <sys/time.h>
 #endif
 
@@ -72,11 +74,34 @@ public:
     _time(_end);
   }
 
+  void offset(int64_t minutes_arg, int64_t seconds_arg, int64_t nanoseconds)
+  {
+    reset();
+    _end= _begin;
+    _end.tv_sec+= (minutes_arg * 60) +seconds_arg;
+    _end.tv_nsec+= nanoseconds;
+  }
+
+  int64_t minutes()
+  {
+    struct timespec result;
+    difference(result);
+    return int64_t(result.tv_sec / 60);
+  }
+
+  uint64_t elapsed_milliseconds() const
+  {
+    struct timespec temp;
+    difference(temp);
+
+    return temp.tv_sec*1000 +temp.tv_nsec/1000000;
+  }
+
   void difference(struct timespec& arg) const
   {
     if ((_end.tv_nsec -_begin.tv_nsec) < 0)
     {
-      arg.tv_sec= _end.tv_sec -_begin.tv_sec-1;
+      arg.tv_sec= _end.tv_sec -_begin.tv_sec -1;
       arg.tv_nsec= 1000000000 +_end.tv_nsec -_begin.tv_nsec;
 
     }
@@ -98,8 +123,24 @@ private:
     mach_port_deallocate(mach_task_self(), _clock_serv);
     ts.tv_sec= _mach_timespec.tv_sec;
     ts.tv_nsec= _mach_timespec.tv_nsec;
+#elif defined(HAVE_CLOCK_GETTIME) && HAVE_CLOCK_GETTIME
+    int ret;
+    do
+    {
+      ret= clock_gettime(CLOCK_REALTIME, &ts);
+    } while (ret == -1);
+#elif defined(HAVE_GETTIMEOFDAY) && HAVE_GETTIMEOFDAY
+    struct timeval tv;
+    int ret;
+    do 
+    {
+      ret= gettimeofday(&tv, NULL)
+    } while (ret == -1);
+    /* Convert from timeval to timespec */
+    ts.tv_sec= tv.tv_sec;
+    ts.tv_nsec= tv.tv_usec * 1000;
 #else
-    clock_gettime(CLOCK_REALTIME, &ts);
+    memset(&ts, 0, sizeof(struct timespec));
 #endif
   }