diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/driver.cc | 1 | ||||
-rw-r--r-- | kernel/log.h | 16 | ||||
-rw-r--r-- | kernel/register.cc | 1 |
3 files changed, 18 insertions, 0 deletions
diff --git a/kernel/driver.cc b/kernel/driver.cc index 00a61ec0f..ce95cad4f 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -24,6 +24,7 @@ #include <unistd.h> #include <libgen.h> #include <dlfcn.h> +#include <errno.h> #include <algorithm> diff --git a/kernel/log.h b/kernel/log.h index c4c03352a..fbc3c1c39 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -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() { diff --git a/kernel/register.cc b/kernel/register.cc index ee14ffbad..ab5cba11b 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -23,6 +23,7 @@ #include <string.h> #include <stdlib.h> #include <stdio.h> +#include <errno.h> using namespace REGISTER_INTERN; #define MAX_REG_COUNT 1000 |