]> www.ginac.de Git - cln.git/blob - src/timing/cl_t_current2.cc
Use paths relative the `src' directory in the #include directives.
[cln.git] / src / timing / cl_t_current2.cc
1 // cl_current_time_consumption().
2
3 // General includes.
4 #include "base/cl_sysdep.h"
5
6 // Specification.
7 #include "cln/timing.h"
8
9
10 // Implementation.
11
12 #include "timing/cl_t_config.h"
13
14 #if defined(HAVE_GETRUSAGE)
15   #include <sys/types.h>
16   #include <sys/time.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);
24 #endif
25 #ifdef HAVE_PERROR_DECL
26   #include <cerrno>
27   #include <cstdio>
28 #else
29   extern "C" int perror (const char *);
30 #endif
31
32 namespace cln {
33
34 const cl_time_consumption cl_current_time_consumption ()
35 {
36         var cl_time_consumption result;
37
38         var cl_timespec time = cl_current_time();
39         result.realtime.tv_sec  = time.tv_sec;
40         result.realtime.tv_nsec = time.tv_nsec;
41
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);
48         } else {
49                 perror("getrusage");
50                 result.usertime.tv_sec = 0; result.usertime.tv_nsec = 0;
51         }
52 #elif defined(HAVE_SYS_TIMES_H)
53         var struct tms usage;
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));
59         } else {
60                 // ignore error ??
61                 result.usertime.tv_sec = 0; result.usertime.tv_nsec = 0;
62         }
63 #else
64         result.usertime = result.realtime;
65 #endif
66
67         return result;
68 }
69
70 }  // namespace cln