time.h revision 289625
1/* $FreeBSD: head/sys/ofed/include/linux/time.h 289625 2015-10-20 11:42:00Z hselasky $ */
2/*-
3 * Copyright (c) 2014-2015 Fran��ois Tigeot
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice unmodified, this list of conditions, and the following
11 *    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 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#ifndef _LINUX_TIME_H_
29#define	_LINUX_TIME_H_
30
31#define	NSEC_PER_USEC	1000L
32#define	NSEC_PER_SEC	1000000000L
33
34#include <sys/time.h>
35#include <sys/stdint.h>
36
37static inline struct timeval
38ns_to_timeval(const int64_t nsec)
39{
40	struct timeval tv;
41	long rem;
42
43	if (nsec == 0) {
44		tv.tv_sec = 0;
45		tv.tv_usec = 0;
46		return (tv);
47	}
48
49	tv.tv_sec = nsec / NSEC_PER_SEC;
50	rem = nsec % NSEC_PER_SEC;
51	if (rem < 0) {
52		tv.tv_sec--;
53		rem += NSEC_PER_SEC;
54	}
55	tv.tv_usec = rem / 1000;
56	return (tv);
57}
58
59static inline int64_t
60timeval_to_ns(const struct timeval *tv)
61{
62	return ((int64_t)tv->tv_sec * NSEC_PER_SEC) +
63		tv->tv_usec * NSEC_PER_USEC;
64}
65
66#define getrawmonotonic(ts)	nanouptime(ts)
67
68static inline struct timespec
69timespec_sub(struct timespec lhs, struct timespec rhs)
70{
71	struct timespec ts;
72
73	ts.tv_sec = lhs.tv_sec;
74	ts.tv_nsec = lhs.tv_nsec;
75	timespecsub(&ts, &rhs);
76
77	return ts;
78}
79
80static inline void
81set_normalized_timespec(struct timespec *ts, time_t sec, int64_t nsec)
82{
83	/* XXX: this doesn't actually normalize anything */
84	ts->tv_sec = sec;
85	ts->tv_nsec = nsec;
86}
87
88static inline int64_t
89timespec_to_ns(const struct timespec *ts)
90{
91	return ((ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec);
92}
93
94static inline struct timespec
95ns_to_timespec(const int64_t nsec)
96{
97	struct timespec ts;
98	int32_t rem;
99
100	if (nsec == 0) {
101		ts.tv_sec = 0;
102		ts.tv_nsec = 0;
103		return (ts);
104	}
105
106	ts.tv_sec = nsec / NSEC_PER_SEC;
107	rem = nsec % NSEC_PER_SEC;
108	if (rem < 0) {
109		ts.tv_sec--;
110		rem += NSEC_PER_SEC;
111	}
112	ts.tv_nsec = rem;
113	return (ts);
114}
115
116static inline int
117timespec_valid(const struct timespec *ts)
118{
119	if (ts->tv_sec < 0 || ts->tv_sec > 100000000 ||
120	    ts->tv_nsec < 0 || ts->tv_nsec >= 1000000000)
121		return (0);
122	return (1);
123}
124
125static inline unsigned long
126get_seconds(void)
127{
128	return time_uptime;
129}
130
131#endif /* _LINUX_TIME_H_ */
132