root / lab4 / .minix-src / include / sys / time.h @ 14
History | View | Annotate | Download (9.36 KB)
1 |
/* $NetBSD: time.h,v 1.70 2015/07/31 12:51:32 kamil Exp $ */
|
---|---|
2 |
|
3 |
/*
|
4 |
* Copyright (c) 1982, 1986, 1993
|
5 |
* The Regents of the University of California. All rights reserved.
|
6 |
*
|
7 |
* Redistribution and use in source and binary forms, with or without
|
8 |
* modification, are permitted provided that the following conditions
|
9 |
* are met:
|
10 |
* 1. Redistributions of source code must retain the above copyright
|
11 |
* notice, this list of conditions and the following disclaimer.
|
12 |
* 2. Redistributions in binary form must reproduce the above copyright
|
13 |
* notice, this list of conditions and the following disclaimer in the
|
14 |
* documentation and/or other materials provided with the distribution.
|
15 |
* 3. Neither the name of the University nor the names of its contributors
|
16 |
* may be used to endorse or promote products derived from this software
|
17 |
* without specific prior written permission.
|
18 |
*
|
19 |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
20 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
21 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
22 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
23 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
24 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
25 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
26 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
27 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
28 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
29 |
* SUCH DAMAGE.
|
30 |
*
|
31 |
* @(#)time.h 8.5 (Berkeley) 5/4/95
|
32 |
*/
|
33 |
|
34 |
#ifndef _SYS_TIME_H_
|
35 |
#define _SYS_TIME_H_
|
36 |
|
37 |
#include <sys/featuretest.h> |
38 |
#include <sys/types.h> |
39 |
|
40 |
/*
|
41 |
* Structure returned by gettimeofday(2) system call,
|
42 |
* and used in other calls.
|
43 |
*/
|
44 |
struct timeval {
|
45 |
time_t tv_sec; /* seconds */
|
46 |
suseconds_t tv_usec; /* and microseconds */
|
47 |
}; |
48 |
|
49 |
#include <sys/timespec.h> |
50 |
|
51 |
#if defined(_NETBSD_SOURCE)
|
52 |
#define TIMEVAL_TO_TIMESPEC(tv, ts) do { \ |
53 |
(ts)->tv_sec = (tv)->tv_sec; \ |
54 |
(ts)->tv_nsec = (tv)->tv_usec * 1000; \
|
55 |
} while (/*CONSTCOND*/0) |
56 |
#define TIMESPEC_TO_TIMEVAL(tv, ts) do { \ |
57 |
(tv)->tv_sec = (ts)->tv_sec; \ |
58 |
(tv)->tv_usec = (suseconds_t)(ts)->tv_nsec / 1000; \
|
59 |
} while (/*CONSTCOND*/0) |
60 |
|
61 |
/*
|
62 |
* Note: timezone is obsolete. All timezone handling is now in
|
63 |
* userland. Its just here for back compatibility.
|
64 |
*/
|
65 |
struct timezone {
|
66 |
int tz_minuteswest; /* minutes west of Greenwich */ |
67 |
int tz_dsttime; /* type of dst correction */ |
68 |
}; |
69 |
|
70 |
/* Operations on timevals. */
|
71 |
#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0L |
72 |
#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
|
73 |
#define timercmp(tvp, uvp, cmp) \
|
74 |
(((tvp)->tv_sec == (uvp)->tv_sec) ? \ |
75 |
((tvp)->tv_usec cmp (uvp)->tv_usec) : \ |
76 |
((tvp)->tv_sec cmp (uvp)->tv_sec)) |
77 |
#define timeradd(tvp, uvp, vvp) \
|
78 |
do { \
|
79 |
(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ |
80 |
(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ |
81 |
if ((vvp)->tv_usec >= 1000000) { \ |
82 |
(vvp)->tv_sec++; \ |
83 |
(vvp)->tv_usec -= 1000000; \
|
84 |
} \ |
85 |
} while (/* CONSTCOND */ 0) |
86 |
#define timersub(tvp, uvp, vvp) \
|
87 |
do { \
|
88 |
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ |
89 |
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ |
90 |
if ((vvp)->tv_usec < 0) { \ |
91 |
(vvp)->tv_sec--; \ |
92 |
(vvp)->tv_usec += 1000000; \
|
93 |
} \ |
94 |
} while (/* CONSTCOND */ 0) |
95 |
|
96 |
/*
|
97 |
* hide bintime for _STANDALONE because this header is used for hpcboot.exe,
|
98 |
* which is built with compilers which don't recognize LL suffix.
|
99 |
* http://mail-index.NetBSD.org/tech-userlevel/2008/02/27/msg000181.html
|
100 |
*/
|
101 |
#if !defined(_STANDALONE)
|
102 |
struct bintime {
|
103 |
time_t sec; |
104 |
uint64_t frac; |
105 |
}; |
106 |
|
107 |
static __inline void |
108 |
bintime_addx(struct bintime *bt, uint64_t x)
|
109 |
{ |
110 |
uint64_t u; |
111 |
|
112 |
u = bt->frac; |
113 |
bt->frac += x; |
114 |
if (u > bt->frac)
|
115 |
bt->sec++; |
116 |
} |
117 |
|
118 |
static __inline void |
119 |
bintime_add(struct bintime *bt, const struct bintime *bt2) |
120 |
{ |
121 |
uint64_t u; |
122 |
|
123 |
u = bt->frac; |
124 |
bt->frac += bt2->frac; |
125 |
if (u > bt->frac)
|
126 |
bt->sec++; |
127 |
bt->sec += bt2->sec; |
128 |
} |
129 |
|
130 |
static __inline void |
131 |
bintime_sub(struct bintime *bt, const struct bintime *bt2) |
132 |
{ |
133 |
uint64_t u; |
134 |
|
135 |
u = bt->frac; |
136 |
bt->frac -= bt2->frac; |
137 |
if (u < bt->frac)
|
138 |
bt->sec--; |
139 |
bt->sec -= bt2->sec; |
140 |
} |
141 |
|
142 |
#define bintimecmp(bta, btb, cmp) \
|
143 |
(((bta)->sec == (btb)->sec) ? \ |
144 |
((bta)->frac cmp (btb)->frac) : \ |
145 |
((bta)->sec cmp (btb)->sec)) |
146 |
|
147 |
/*-
|
148 |
* Background information:
|
149 |
*
|
150 |
* When converting between timestamps on parallel timescales of differing
|
151 |
* resolutions it is historical and scientific practice to round down rather
|
152 |
* than doing 4/5 rounding.
|
153 |
*
|
154 |
* The date changes at midnight, not at noon.
|
155 |
*
|
156 |
* Even at 15:59:59.999999999 it's not four'o'clock.
|
157 |
*
|
158 |
* time_second ticks after N.999999999 not after N.4999999999
|
159 |
*/
|
160 |
|
161 |
static __inline void |
162 |
bintime2timespec(const struct bintime *bt, struct timespec *ts) |
163 |
{ |
164 |
|
165 |
ts->tv_sec = bt->sec; |
166 |
ts->tv_nsec = |
167 |
(long)(((uint64_t)1000000000 * (uint32_t)(bt->frac >> 32)) >> 32); |
168 |
} |
169 |
|
170 |
static __inline void |
171 |
timespec2bintime(const struct timespec *ts, struct bintime *bt) |
172 |
{ |
173 |
|
174 |
bt->sec = ts->tv_sec; |
175 |
/* 18446744073 = int(2^64 / 1000000000) */
|
176 |
bt->frac = (uint64_t)ts->tv_nsec * (uint64_t)18446744073ULL;
|
177 |
} |
178 |
|
179 |
static __inline void |
180 |
bintime2timeval(const struct bintime *bt, struct timeval *tv) |
181 |
{ |
182 |
|
183 |
tv->tv_sec = bt->sec; |
184 |
tv->tv_usec = |
185 |
(suseconds_t)(((uint64_t)1000000 * (uint32_t)(bt->frac >> 32)) >> 32); |
186 |
} |
187 |
|
188 |
static __inline void |
189 |
timeval2bintime(const struct timeval *tv, struct bintime *bt) |
190 |
{ |
191 |
|
192 |
bt->sec = tv->tv_sec; |
193 |
/* 18446744073709 = int(2^64 / 1000000) */
|
194 |
bt->frac = (uint64_t)tv->tv_usec * (uint64_t)18446744073709ULL;
|
195 |
} |
196 |
|
197 |
static __inline struct bintime |
198 |
ms2bintime(uint64_t ms) |
199 |
{ |
200 |
struct bintime bt;
|
201 |
|
202 |
bt.sec = ms / 1000U;
|
203 |
bt.frac = (((ms % 1000U) >> 32)/1000U) >> 32; |
204 |
|
205 |
return bt;
|
206 |
} |
207 |
|
208 |
static __inline struct bintime |
209 |
us2bintime(uint64_t us) |
210 |
{ |
211 |
struct bintime bt;
|
212 |
|
213 |
bt.sec = us / 1000000U;
|
214 |
bt.frac = (((us % 1000000U) >> 32)/1000000U) >> 32; |
215 |
|
216 |
return bt;
|
217 |
} |
218 |
|
219 |
static __inline struct bintime |
220 |
ns2bintime(uint64_t ns) |
221 |
{ |
222 |
struct bintime bt;
|
223 |
|
224 |
bt.sec = ns / 1000000000U;
|
225 |
bt.frac = (((ns % 1000000000U) >> 32)/1000000000U) >> 32; |
226 |
|
227 |
return bt;
|
228 |
} |
229 |
#endif /* !defined(_STANDALONE) */ |
230 |
|
231 |
/* Operations on timespecs. */
|
232 |
#define timespecclear(tsp) (tsp)->tv_sec = (time_t)((tsp)->tv_nsec = 0L) |
233 |
#define timespecisset(tsp) ((tsp)->tv_sec || (tsp)->tv_nsec)
|
234 |
#define timespeccmp(tsp, usp, cmp) \
|
235 |
(((tsp)->tv_sec == (usp)->tv_sec) ? \ |
236 |
((tsp)->tv_nsec cmp (usp)->tv_nsec) : \ |
237 |
((tsp)->tv_sec cmp (usp)->tv_sec)) |
238 |
#define timespecadd(tsp, usp, vsp) \
|
239 |
do { \
|
240 |
(vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \ |
241 |
(vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \ |
242 |
if ((vsp)->tv_nsec >= 1000000000L) { \ |
243 |
(vsp)->tv_sec++; \ |
244 |
(vsp)->tv_nsec -= 1000000000L; \
|
245 |
} \ |
246 |
} while (/* CONSTCOND */ 0) |
247 |
#define timespecsub(tsp, usp, vsp) \
|
248 |
do { \
|
249 |
(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \ |
250 |
(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \ |
251 |
if ((vsp)->tv_nsec < 0) { \ |
252 |
(vsp)->tv_sec--; \ |
253 |
(vsp)->tv_nsec += 1000000000L; \
|
254 |
} \ |
255 |
} while (/* CONSTCOND */ 0) |
256 |
#define timespec2ns(x) (((uint64_t)(x)->tv_sec) * 1000000000L + (x)->tv_nsec) |
257 |
#endif /* _NETBSD_SOURCE */ |
258 |
|
259 |
/*
|
260 |
* Names of the interval timers, and structure
|
261 |
* defining a timer setting.
|
262 |
* NB: Must match the CLOCK_ constants below.
|
263 |
*/
|
264 |
#define ITIMER_REAL 0 |
265 |
#define ITIMER_VIRTUAL 1 |
266 |
#define ITIMER_PROF 2 |
267 |
#define ITIMER_MONOTONIC 3 |
268 |
|
269 |
struct itimerval {
|
270 |
struct timeval it_interval; /* timer interval */ |
271 |
struct timeval it_value; /* current value */ |
272 |
}; |
273 |
|
274 |
/*
|
275 |
* Structure defined by POSIX.1b to be like a itimerval, but with
|
276 |
* timespecs. Used in the timer_*() system calls.
|
277 |
*/
|
278 |
struct itimerspec {
|
279 |
struct timespec it_interval;
|
280 |
struct timespec it_value;
|
281 |
}; |
282 |
|
283 |
#define CLOCK_REALTIME 0 |
284 |
#if !defined(__minix)
|
285 |
#define CLOCK_VIRTUAL 1 |
286 |
#define CLOCK_PROF 2 |
287 |
#endif /* !defined(__minix) */ |
288 |
#define CLOCK_MONOTONIC 3 |
289 |
|
290 |
#if defined(_NETBSD_SOURCE)
|
291 |
#define TIMER_RELTIME 0x0 /* relative timer */ |
292 |
#endif
|
293 |
#define TIMER_ABSTIME 0x1 /* absolute timer */ |
294 |
|
295 |
#ifdef _KERNEL
|
296 |
#include <sys/timevar.h> |
297 |
#else /* !_KERNEL */ |
298 |
#ifndef _STANDALONE
|
299 |
#if (_POSIX_C_SOURCE - 0) >= 200112L || \ |
300 |
(defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED)) || \ |
301 |
(_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE) |
302 |
#include <sys/select.h> |
303 |
#endif
|
304 |
|
305 |
#include <sys/cdefs.h> |
306 |
#include <time.h> |
307 |
|
308 |
__BEGIN_DECLS |
309 |
#ifndef __LIBC12_SOURCE__
|
310 |
#if (_POSIX_C_SOURCE - 0) >= 200112L || \ |
311 |
defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) |
312 |
int getitimer(int, struct itimerval *) __RENAME(__getitimer50); |
313 |
int gettimeofday(struct timeval * __restrict, void *__restrict) |
314 |
__RENAME(__gettimeofday50); |
315 |
int setitimer(int, const struct itimerval * __restrict, |
316 |
struct itimerval * __restrict) __RENAME(__setitimer50);
|
317 |
int utimes(const char *, const struct timeval [2]) __RENAME(__utimes50); |
318 |
#endif /* _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE || _NETBSD_SOURCE */ |
319 |
|
320 |
#if defined(_NETBSD_SOURCE) || defined(HAVE_NBTOOL_CONFIG_H)
|
321 |
int adjtime(const struct timeval *, struct timeval *) __RENAME(__adjtime50); |
322 |
int futimes(int, const struct timeval [2]) __RENAME(__futimes50); |
323 |
int lutimes(const char *, const struct timeval [2]) __RENAME(__lutimes50); |
324 |
int settimeofday(const struct timeval * __restrict, |
325 |
const void *__restrict) __RENAME(__settimeofday50); |
326 |
#endif /* _NETBSD_SOURCE */ |
327 |
#endif /* __LIBC12_SOURCE__ */ |
328 |
__END_DECLS |
329 |
|
330 |
#endif /* !_STANDALONE */ |
331 |
#endif /* !_KERNEL */ |
332 |
#endif /* !_SYS_TIME_H_ */ |