1 /*
2  * Copyright (c) 1982, 1986 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *    This product includes software developed by the University of
16  *    California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *    @(#)time.h    7.6 (Berkeley) 2/22/91
34  */
35 
36 /* messed about with substantially by @feilipu October 2019 */
37 
38 #ifndef _SYS_TIME_H_
39 #define _SYS_TIME_H_
40 
41 #include <sys/types.h>
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
47 /*
48  * Structure returned by clock_gettime() system call
49  * and used in other calls.
50  */
51 
52 struct timespec {
53     time_t      tv_sec;     /* seconds */
54     nseconds_t  tv_nsec;    /* and nanoseconds */
55 };
56 
57 enum clock_id {
58     CLOCK_REALTIME,
59     CLOCK_MONOTONIC,
60     CLOCK_PROCESS_CPUTIME_ID,
61     CLOCK_THREAD_CPUTIME_ID,
62     CLOCK_MONOTONIC_RAW,
63     CLOCK_REALTIME_COARSE,
64     CLOCK_MONOTONIC_COARSE
65 };
66 
67 /*
68  * Convenience macros for operations on timevals
69  * NOTE: `timercmp' does not work for >= or <=
70  */
71 
72 #define    timerisset(tvp)  ((tvp)->tv_sec || (tvp)->tv_nsec)
73 #define    timerclear(tvp)  ((tvp)->tv_sec = (tvp)->tv_nsec = 0)
74 #define    timercmp(a, b, CMP)                                  \
75   (((a)->tv_sec == (b)->tv_sec) ?                               \
76    ((a)->tv_nsec CMP (b)->tv_nsec) :                            \
77    ((a)->tv_sec CMP (b)->tv_sec))
78 #define    timeradd(a, b, result)                               \
79   do {                                                          \
80     (result)->tv_sec = (a)->tv_sec + (b)->tv_sec;               \
81     (result)->tv_nsec = (a)->tv_nsec + (b)->tv_nsec;            \
82     if ((result)->tv_nsec >= 1000000000)                        \
83       {                                                         \
84     ++(result)->tv_sec;                                         \
85     (result)->tv_nsec -= 1000000000;                            \
86       }                                                         \
87   } while (0)
88 #define    timersub(a, b, result)                               \
89   do {                                                          \
90     (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;               \
91     (result)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec;            \
92     if ((a)->tv_nsec < ((b)->tv_nsec) {                         \
93       --(result)->tv_sec;                                       \
94       (result)->tv_nsec += 1000000000;                          \
95     }                                                           \
96   } while (0)
97 
98 
99 #ifdef __cplusplus
100 }
101 #endif
102 #endif /* !_SYS_TIME_H_ */
103