- kernel/log.h: add rusage()-based fallback for systems without clock_gettime().
authorSiesh1oo <siesh1oo@siesh1oo.no>
Mon, 10 Mar 2014 13:36:07 +0000 (14:36 +0100)
committerSiesh1oo <siesh1oo@siesh1oo.no>
Mon, 10 Mar 2014 13:36:07 +0000 (14:36 +0100)
kernel/log.h

index c4c03352af7815f0408d62c63b3009a6b5ae70f2..fbc3c1c39be5dd19edcb1e188796213450df0d03 100644 (file)
@@ -23,6 +23,8 @@
 #include "kernel/rtlil.h"
 #include <stdio.h>
 #include <time.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 #include <vector>
 
 extern std::vector<FILE*> log_files;
@@ -65,9 +67,23 @@ struct PerformanceTimer
        }
 
        static int64_t query() {
+#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0)
                struct timespec ts;
                clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts);
                return int64_t(ts.tv_sec)*1000000000 + ts.tv_nsec;
+#elif defined(RUSAGE_SELF)
+               struct rusage rusage;
+               int64_t t;
+               if (getrusage(RUSAGE_SELF, &rusage) == -1) {
+                       log_cmd_error("getrusage failed!\n");
+                       log_abort();
+               }
+               t = 1000000000ULL * (int64_t) rusage.ru_utime.tv_sec + (int64_t) rusage.ru_utime.tv_usec * 1000ULL;
+               t += 1000000000ULL * (int64_t) rusage.ru_stime.tv_sec + (int64_t) rusage.ru_stime.tv_usec * 1000ULL;
+               return t;
+#else
+       #error Dont know how to measure per-process CPU time. Need alternative method (times()/clocks()/gettimeofday()?).
+#endif
        }
 
        void reset() {