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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
9759915b2aca all: prefer https: URLs
Paul Eggert <eggert@cs.ucla.edu>
parents: 18663
diff changeset
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