timespec.h 2.74 KB
Newer Older
1 2
/* timespec -- System time interface

Paul Eggert's avatar
Paul Eggert committed
3
   Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2020 Free Software
4 5 6 7 8 9 10 11 12 13 14 15 16
   Foundation, Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
Paul Eggert's avatar
Paul Eggert committed
17
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
18 19

#if ! defined TIMESPEC_H
20
#define TIMESPEC_H
21

22
#include <time.h>
23

Paul Eggert's avatar
Paul Eggert committed
24 25 26
#ifndef _GL_INLINE_HEADER_BEGIN
 #error "Please include config.h first."
#endif
27 28 29 30 31
_GL_INLINE_HEADER_BEGIN
#ifndef _GL_TIMESPEC_INLINE
# define _GL_TIMESPEC_INLINE _GL_INLINE
#endif

Paul Eggert's avatar
Paul Eggert committed
32 33 34 35
#ifdef __cplusplus
extern "C" {
#endif

36
#include "arg-nonnull.h"
Paul Eggert's avatar
Paul Eggert committed
37

Paul Eggert's avatar
Paul Eggert committed
38 39
/* Inverse resolution of timespec timestamps (in units per second),
   and log base 10 of the inverse resolution.  */
40

Paul Eggert's avatar
Paul Eggert committed
41 42 43 44 45 46 47 48
enum { TIMESPEC_HZ = 1000000000 };
enum { LOG10_TIMESPEC_HZ = 9 };

/* Obsolescent names for backward compatibility.
   They are misnomers, because TIMESPEC_RESOLUTION is not a resolution.  */

enum { TIMESPEC_RESOLUTION = TIMESPEC_HZ };
enum { LOG10_TIMESPEC_RESOLUTION = LOG10_TIMESPEC_HZ };
49 50 51 52 53 54 55 56 57 58 59 60

/* Return a timespec with seconds S and nanoseconds NS.  */

_GL_TIMESPEC_INLINE struct timespec
make_timespec (time_t s, long int ns)
{
  struct timespec r;
  r.tv_sec = s;
  r.tv_nsec = ns;
  return r;
}

Paul Eggert's avatar
Paul Eggert committed
61
/* Return negative, zero, positive if A < B, A == B, A > B, respectively.  */
62

Paul Eggert's avatar
Paul Eggert committed
63
_GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE
64 65
timespec_cmp (struct timespec a, struct timespec b)
{
Paul Eggert's avatar
Paul Eggert committed
66
  return 2 * _GL_CMP (a.tv_sec, b.tv_sec) + _GL_CMP (a.tv_nsec, b.tv_nsec);
67 68 69 70
}

/* Return -1, 0, 1, depending on the sign of A.  A.tv_nsec must be
   nonnegative.  */
Paul Eggert's avatar
Paul Eggert committed
71
_GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE
72 73
timespec_sign (struct timespec a)
{
Paul Eggert's avatar
Paul Eggert committed
74
  return _GL_CMP (a.tv_sec, 0) + (!a.tv_sec & !!a.tv_nsec);
75 76
}

Paul Eggert's avatar
Paul Eggert committed
77 78 79 80 81 82
struct timespec timespec_add (struct timespec, struct timespec)
  _GL_ATTRIBUTE_CONST;
struct timespec timespec_sub (struct timespec, struct timespec)
  _GL_ATTRIBUTE_CONST;
struct timespec dtotimespec (double)
  _GL_ATTRIBUTE_CONST;
83 84

/* Return an approximation to A, of type 'double'.  */
85
_GL_TIMESPEC_INLINE double
86 87 88 89 90
timespectod (struct timespec a)
{
  return a.tv_sec + a.tv_nsec / 1e9;
}

91 92 93
struct timespec current_timespec (void);
void gettime (struct timespec *) _GL_ARG_NONNULL ((1));
int settime (struct timespec const *) _GL_ARG_NONNULL ((1));
94

Paul Eggert's avatar
Paul Eggert committed
95 96 97 98
#ifdef __cplusplus
}
#endif

99 100
_GL_INLINE_HEADER_END

101
#endif