]> www.ginac.de Git - cln.git/blob - src/timing/cl_t_current2.cc
Ensure that makeinfo ≥ 6.8 checks the @menu structure.
[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 #include <cerrno>
26 #include <cstdio>
27
28 namespace cln {
29
30 const cl_time_consumption cl_current_time_consumption ()
31 {
32         var cl_time_consumption result;
33
34         var cl_timespec time = cl_current_time();
35         result.realtime.tv_sec  = time.tv_sec;
36         result.realtime.tv_nsec = time.tv_nsec;
37
38 #if defined(HAVE_GETRUSAGE)
39         var struct rusage usage;
40         if (getrusage(RUSAGE_SELF,&usage) == 0) {
41                 // use ru_utime only, ignore ru_stime.
42                 result.usertime.tv_sec  = usage.ru_utime.tv_sec;
43                 result.usertime.tv_nsec = usage.ru_utime.tv_usec * (1000000000/1000000);
44         } else {
45                 perror("getrusage");
46                 result.usertime.tv_sec = 0; result.usertime.tv_nsec = 0;
47         }
48 #elif defined(HAVE_SYS_TIMES_H)
49         var struct tms usage;
50         if (times(&usage) != (clock_t)(-1)) {
51                 // use tms_utime only, ignore tms_stime.
52                 var uintL used_time = usage.tms_utime;
53                 result.usertime.tv_sec  = used_time / HZ;
54                 result.usertime.tv_nsec = (used_time % HZ) * ((2*1000000000+HZ)/(2*HZ));
55         } else {
56                 // ignore error ??
57                 result.usertime.tv_sec = 0; result.usertime.tv_nsec = 0;
58         }
59 #else
60         result.usertime = result.realtime;
61 #endif
62
63         return result;
64 }
65
66 }  // namespace cln