1 // cl_current_time_consumption().
4 #include "base/cl_sysdep.h"
7 #include "cln/timing.h"
12 #include "timing/cl_t_config.h"
14 #if defined(HAVE_GETRUSAGE)
15 #include <sys/types.h>
17 #include <sys/resource.h>
18 extern "C" int getrusage (RUSAGE_WHO_T who, struct rusage * rusage);
19 #elif defined(HAVE_SYS_TIMES_H)
20 #include <sys/types.h>
21 #include <sys/param.h> // defines HZ, unit for times() is 1/HZ seconds
22 #include <sys/times.h>
23 extern "C" clock_t times (struct tms * buffer);
25 #ifdef HAVE_PERROR_DECL
29 extern "C" int perror (const char *);
34 const cl_time_consumption cl_current_time_consumption ()
36 var cl_time_consumption result;
38 var cl_timespec time = cl_current_time();
39 result.realtime.tv_sec = time.tv_sec;
40 result.realtime.tv_nsec = time.tv_nsec;
42 #if defined(HAVE_GETRUSAGE)
43 var struct rusage usage;
44 if (getrusage(RUSAGE_SELF,&usage) == 0) {
45 // use ru_utime only, ignore ru_stime.
46 result.usertime.tv_sec = usage.ru_utime.tv_sec;
47 result.usertime.tv_nsec = usage.ru_utime.tv_usec * (1000000000/1000000);
50 result.usertime.tv_sec = 0; result.usertime.tv_nsec = 0;
52 #elif defined(HAVE_SYS_TIMES_H)
54 if (times(&usage) != (clock_t)(-1)) {
55 // use tms_utime only, ignore tms_stime.
56 var uintL used_time = usage.tms_utime;
57 result.usertime.tv_sec = used_time / HZ;
58 result.usertime.tv_nsec = (used_time % HZ) * ((2*1000000000+HZ)/(2*HZ));
61 result.usertime.tv_sec = 0; result.usertime.tv_nsec = 0;
64 result.usertime = result.realtime;