Mercurial > gnulib
annotate lib/xtime.h @ 39916:dbcdcd1db895
timevar: use gethrxtime to get wall clock time
clock_gettime is not portable. gethrxtime takes the best available
option to get the wall clock time, including clock_gettime (monotonic
clock), and gettime (non monotonic).
Also, using xtime_t instead of float preserves the precision.
Suggested by Bruno Haible.
* lib/xtime.h (xtime_make): Handle overflows of nanoseconds.
* modules/timevar (Depends-on): We need gethrxtime.
We no longer use times().
(Link): Update.
* lib/timevar.h (timevar_time_def): Use xtime_t.
* lib/timevar.c (set_to_current_time): Use gethrxtime.
(timevar_print): Instead of checking whether the timings themselves
are large enough for the timevar to be printed, check the percentages.
author | Akim Demaille <akim.demaille@gmail.com> |
---|---|
date | Fri, 12 Oct 2018 06:46:09 +0200 |
parents | 10eb9086bea0 |
children | b06060465f09 |
rev | line source |
---|---|
18663
caf9d6314c8f
maint: time stamp -> timestamp
Paul Eggert <eggert@cs.ucla.edu>
parents:
18626
diff
changeset
|
1 /* xtime -- extended-resolution integer timestamps |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
2 |
19484
10eb9086bea0
maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents:
19190
diff
changeset
|
3 Copyright (C) 2005-2006, 2009-2018 Free Software Foundation, Inc. |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
4 |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7162
diff
changeset
|
5 This program is free software: you can redistribute it and/or modify |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
6 it under the terms of the GNU General Public License as published by |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7162
diff
changeset
|
7 the Free Software Foundation; either version 3 of the License, or |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
7162
diff
changeset
|
8 (at your option) any later version. |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
9 |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
10 This program is distributed in the hope that it will be useful, |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
13 GNU General Public License for more details. |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
14 |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
15 You should have received a copy of the GNU General Public License |
19190 | 16 along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
17 |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
18 /* Written by Paul Eggert. */ |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
19 |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
20 #ifndef XTIME_H_ |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
21 #define XTIME_H_ 1 |
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
22 |
17473
1f9070ef79b0
headers: check that _GL_INLINE_HEADER_BEGIN is defined
Paul Eggert <eggert@cs.ucla.edu>
parents:
17249
diff
changeset
|
23 #ifndef _GL_INLINE_HEADER_BEGIN |
1f9070ef79b0
headers: check that _GL_INLINE_HEADER_BEGIN is defined
Paul Eggert <eggert@cs.ucla.edu>
parents:
17249
diff
changeset
|
24 #error "Please include config.h first." |
1f9070ef79b0
headers: check that _GL_INLINE_HEADER_BEGIN is defined
Paul Eggert <eggert@cs.ucla.edu>
parents:
17249
diff
changeset
|
25 #endif |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
26 _GL_INLINE_HEADER_BEGIN |
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
27 #ifndef XTIME_INLINE |
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
28 # define XTIME_INLINE _GL_INLINE |
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
29 #endif |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
30 |
18663
caf9d6314c8f
maint: time stamp -> timestamp
Paul Eggert <eggert@cs.ucla.edu>
parents:
18626
diff
changeset
|
31 /* xtime_t is a signed type used for timestamps. It is an integer |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
32 type that is a count of nanoseconds -- except for obsolescent hosts |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
33 without sufficiently-wide integers, where it is a count of |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
34 seconds. */ |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
35 #if HAVE_LONG_LONG_INT |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
36 typedef long long int xtime_t; |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
37 # define XTIME_PRECISION 1000000000 |
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
38 #else |
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
39 # include <limits.h> |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
40 typedef long int xtime_t; |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
41 # if LONG_MAX >> 31 >> 31 == 0 |
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
42 # define XTIME_PRECISION 1 |
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
43 # else |
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
44 # define XTIME_PRECISION 1000000000 |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
45 # endif |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
46 #endif |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
47 |
17128
dd67af45a631
gethrxtime: port to C++
Alexandre Duret-Lutz <adl@lrde.epita.fr>
parents:
16201
diff
changeset
|
48 #ifdef __cplusplus |
dd67af45a631
gethrxtime: port to C++
Alexandre Duret-Lutz <adl@lrde.epita.fr>
parents:
16201
diff
changeset
|
49 extern "C" { |
dd67af45a631
gethrxtime: port to C++
Alexandre Duret-Lutz <adl@lrde.epita.fr>
parents:
16201
diff
changeset
|
50 #endif |
dd67af45a631
gethrxtime: port to C++
Alexandre Duret-Lutz <adl@lrde.epita.fr>
parents:
16201
diff
changeset
|
51 |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
52 /* Return an extended time value that contains S seconds and NS |
39916
dbcdcd1db895
timevar: use gethrxtime to get wall clock time
Akim Demaille <akim.demaille@gmail.com>
parents:
19484
diff
changeset
|
53 nanoseconds. */ |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
54 XTIME_INLINE xtime_t |
6504
6038e8590f76
* xtime.h (xtime_make, xtime_nonnegative_nsec, xtime_nsec): Use
Paul Eggert <eggert@cs.ucla.edu>
parents:
6315
diff
changeset
|
55 xtime_make (xtime_t s, long int ns) |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
56 { |
39916
dbcdcd1db895
timevar: use gethrxtime to get wall clock time
Akim Demaille <akim.demaille@gmail.com>
parents:
19484
diff
changeset
|
57 const long int giga = 1000 * 1000 * 1000; |
dbcdcd1db895
timevar: use gethrxtime to get wall clock time
Akim Demaille <akim.demaille@gmail.com>
parents:
19484
diff
changeset
|
58 s += ns / giga; |
dbcdcd1db895
timevar: use gethrxtime to get wall clock time
Akim Demaille <akim.demaille@gmail.com>
parents:
19484
diff
changeset
|
59 ns %= giga; |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
60 if (XTIME_PRECISION == 1) |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
61 return s; |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
62 else |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
63 return XTIME_PRECISION * s + ns; |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
64 } |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
65 |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
66 /* Return the number of seconds in T, which must be nonnegative. */ |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
67 XTIME_INLINE xtime_t |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
68 xtime_nonnegative_sec (xtime_t t) |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
69 { |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
70 return t / XTIME_PRECISION; |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
71 } |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
72 |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
73 /* Return the number of seconds in T. */ |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
74 XTIME_INLINE xtime_t |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
75 xtime_sec (xtime_t t) |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
76 { |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
77 return (XTIME_PRECISION == 1 |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
78 ? t |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
79 : t < 0 |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
80 ? (t + XTIME_PRECISION - 1) / XTIME_PRECISION - 1 |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
81 : xtime_nonnegative_sec (t)); |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
82 } |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
83 |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
84 /* Return the number of nanoseconds in T, which must be nonnegative. */ |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
85 XTIME_INLINE long int |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
86 xtime_nonnegative_nsec (xtime_t t) |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
87 { |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
88 return t % XTIME_PRECISION; |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
89 } |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
90 |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
91 /* Return the number of nanoseconds in T. */ |
17176
fe213f3f2c57
gethrxtime: better 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents:
17128
diff
changeset
|
92 XTIME_INLINE long int |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
93 xtime_nsec (xtime_t t) |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
94 { |
6504
6038e8590f76
* xtime.h (xtime_make, xtime_nonnegative_nsec, xtime_nsec): Use
Paul Eggert <eggert@cs.ucla.edu>
parents:
6315
diff
changeset
|
95 long int ns = t % XTIME_PRECISION; |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
96 if (ns < 0) |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
97 ns += XTIME_PRECISION; |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
98 return ns; |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
99 } |
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
100 |
17128
dd67af45a631
gethrxtime: port to C++
Alexandre Duret-Lutz <adl@lrde.epita.fr>
parents:
16201
diff
changeset
|
101 #ifdef __cplusplus |
dd67af45a631
gethrxtime: port to C++
Alexandre Duret-Lutz <adl@lrde.epita.fr>
parents:
16201
diff
changeset
|
102 } |
5662
42df9db003cc
* modules/gethrxtime: New file.
Paul Eggert <eggert@cs.ucla.edu>
parents:
diff
changeset
|
103 #endif |
17128
dd67af45a631
gethrxtime: port to C++
Alexandre Duret-Lutz <adl@lrde.epita.fr>
parents:
16201
diff
changeset
|
104 |
dd67af45a631
gethrxtime: port to C++
Alexandre Duret-Lutz <adl@lrde.epita.fr>
parents:
16201
diff
changeset
|
105 #endif |