]> bbs.cooldavid.org Git - net-next-2.6.git/blame - include/linux/time.h
[IPV6]: Do not send RH0 anymore.
[net-next-2.6.git] / include / linux / time.h
CommitLineData
1da177e4
LT
1#ifndef _LINUX_TIME_H
2#define _LINUX_TIME_H
3
4#include <linux/types.h>
5
6#ifdef __KERNEL__
57a55875 7# include <linux/seqlock.h>
1da177e4
LT
8#endif
9
10#ifndef _STRUCT_TIMESPEC
11#define _STRUCT_TIMESPEC
12struct timespec {
13 time_t tv_sec; /* seconds */
14 long tv_nsec; /* nanoseconds */
15};
57a55875 16#endif
1da177e4
LT
17
18struct timeval {
19 time_t tv_sec; /* seconds */
20 suseconds_t tv_usec; /* microseconds */
21};
22
23struct timezone {
24 int tz_minuteswest; /* minutes west of Greenwich */
25 int tz_dsttime; /* type of dst correction */
26};
27
28#ifdef __KERNEL__
29
57a55875 30/* Parameters used to convert the timespec values: */
05ebb761
VP
31#define MSEC_PER_SEC 1000L
32#define USEC_PER_MSEC 1000L
33#define NSEC_PER_USEC 1000L
34#define NSEC_PER_MSEC 1000000L
35#define USEC_PER_SEC 1000000L
36#define NSEC_PER_SEC 1000000000L
37#define FSEC_PER_SEC 1000000000000000L
1da177e4 38
643a6545 39static inline int timespec_equal(struct timespec *a, struct timespec *b)
57a55875 40{
1da177e4 41 return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
57a55875 42}
1da177e4 43
643a6545
AM
44/*
45 * lhs < rhs: return <0
46 * lhs == rhs: return 0
47 * lhs > rhs: return >0
48 */
77adbfbf 49static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
643a6545
AM
50{
51 if (lhs->tv_sec < rhs->tv_sec)
52 return -1;
53 if (lhs->tv_sec > rhs->tv_sec)
54 return 1;
55 return lhs->tv_nsec - rhs->tv_nsec;
56}
57
77adbfbf 58static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
643a6545
AM
59{
60 if (lhs->tv_sec < rhs->tv_sec)
61 return -1;
62 if (lhs->tv_sec > rhs->tv_sec)
63 return 1;
64 return lhs->tv_usec - rhs->tv_usec;
65}
66
f4818900
IM
67extern unsigned long mktime(const unsigned int year, const unsigned int mon,
68 const unsigned int day, const unsigned int hour,
69 const unsigned int min, const unsigned int sec);
70
71extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec);
1da177e4 72
ca74e92b
SN
73/*
74 * sub = lhs - rhs, in normalized form
75 */
76static inline struct timespec timespec_sub(struct timespec lhs,
77 struct timespec rhs)
78{
79 struct timespec ts_delta;
80 set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec,
81 lhs.tv_nsec - rhs.tv_nsec);
82 return ts_delta;
83}
84
5f82b2b7
TG
85/*
86 * Returns true if the timespec is norm, false if denorm:
87 */
88#define timespec_valid(ts) \
bd3f8f2b 89 (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
5f82b2b7 90
1da177e4
LT
91extern struct timespec xtime;
92extern struct timespec wall_to_monotonic;
5809f9d4 93extern seqlock_t xtime_lock __attribute__((weak));
1da177e4 94
411187fb 95extern unsigned long read_persistent_clock(void);
ad596171
JS
96void timekeeping_init(void);
97
1da177e4 98static inline unsigned long get_seconds(void)
57a55875 99{
1da177e4
LT
100 return xtime.tv_sec;
101}
102
103struct timespec current_kernel_time(void);
104
57a55875
IM
105#define CURRENT_TIME (current_kernel_time())
106#define CURRENT_TIME_SEC ((struct timespec) { xtime.tv_sec, 0 })
1da177e4
LT
107
108extern void do_gettimeofday(struct timeval *tv);
109extern int do_settimeofday(struct timespec *tv);
110extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
becf8b5d 111#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
1c710c89 112extern long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags);
1da177e4 113struct itimerval;
57a55875
IM
114extern int do_setitimer(int which, struct itimerval *value,
115 struct itimerval *ovalue);
c08b8a49 116extern unsigned int alarm_setitimer(unsigned int seconds);
1da177e4 117extern int do_getitimer(int which, struct itimerval *value);
57a55875 118extern void getnstimeofday(struct timespec *tv);
1da177e4
LT
119
120extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
cf3c769b 121extern int timekeeping_is_continuous(void);
8524070b 122extern void update_wall_time(void);
1da177e4 123
f8f46da3
TG
124/**
125 * timespec_to_ns - Convert timespec to nanoseconds
126 * @ts: pointer to the timespec variable to be converted
127 *
128 * Returns the scalar nanosecond representation of the timespec
129 * parameter.
130 */
df869b63 131static inline s64 timespec_to_ns(const struct timespec *ts)
f8f46da3 132{
df869b63 133 return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
f8f46da3
TG
134}
135
136/**
137 * timeval_to_ns - Convert timeval to nanoseconds
138 * @ts: pointer to the timeval variable to be converted
139 *
140 * Returns the scalar nanosecond representation of the timeval
141 * parameter.
142 */
df869b63 143static inline s64 timeval_to_ns(const struct timeval *tv)
f8f46da3 144{
df869b63 145 return ((s64) tv->tv_sec * NSEC_PER_SEC) +
f8f46da3
TG
146 tv->tv_usec * NSEC_PER_USEC;
147}
148
149/**
150 * ns_to_timespec - Convert nanoseconds to timespec
151 * @nsec: the nanoseconds value to be converted
152 *
153 * Returns the timespec representation of the nsec parameter.
154 */
df869b63 155extern struct timespec ns_to_timespec(const s64 nsec);
f8f46da3
TG
156
157/**
158 * ns_to_timeval - Convert nanoseconds to timeval
159 * @nsec: the nanoseconds value to be converted
160 *
161 * Returns the timeval representation of the nsec parameter.
162 */
df869b63 163extern struct timeval ns_to_timeval(const s64 nsec);
f8f46da3 164
cf3c769b
JS
165/**
166 * timespec_add_ns - Adds nanoseconds to a timespec
167 * @a: pointer to timespec to be incremented
168 * @ns: unsigned nanoseconds value to be added
169 */
170static inline void timespec_add_ns(struct timespec *a, u64 ns)
171{
172 ns += a->tv_nsec;
173 while(unlikely(ns >= NSEC_PER_SEC)) {
174 ns -= NSEC_PER_SEC;
175 a->tv_sec++;
176 }
177 a->tv_nsec = ns;
178}
1da177e4
LT
179#endif /* __KERNEL__ */
180
181#define NFDBITS __NFDBITS
182
183#define FD_SETSIZE __FD_SETSIZE
184#define FD_SET(fd,fdsetp) __FD_SET(fd,fdsetp)
185#define FD_CLR(fd,fdsetp) __FD_CLR(fd,fdsetp)
186#define FD_ISSET(fd,fdsetp) __FD_ISSET(fd,fdsetp)
187#define FD_ZERO(fdsetp) __FD_ZERO(fdsetp)
188
189/*
190 * Names of the interval timers, and structure
57a55875 191 * defining a timer setting:
1da177e4 192 */
57a55875
IM
193#define ITIMER_REAL 0
194#define ITIMER_VIRTUAL 1
195#define ITIMER_PROF 2
1da177e4 196
57a55875
IM
197struct itimerspec {
198 struct timespec it_interval; /* timer period */
199 struct timespec it_value; /* timer expiration */
1da177e4
LT
200};
201
57a55875
IM
202struct itimerval {
203 struct timeval it_interval; /* timer interval */
204 struct timeval it_value; /* current value */
1da177e4
LT
205};
206
1da177e4 207/*
57a55875 208 * The IDs of the various system clocks (for POSIX.1b interval timers):
1da177e4 209 */
1ad106ca
IM
210#define CLOCK_REALTIME 0
211#define CLOCK_MONOTONIC 1
212#define CLOCK_PROCESS_CPUTIME_ID 2
213#define CLOCK_THREAD_CPUTIME_ID 3
1da177e4
LT
214
215/*
57a55875 216 * The IDs of various hardware clocks:
1da177e4 217 */
1ad106ca
IM
218#define CLOCK_SGI_CYCLE 10
219#define MAX_CLOCKS 16
220#define CLOCKS_MASK (CLOCK_REALTIME | CLOCK_MONOTONIC)
221#define CLOCKS_MONO CLOCK_MONOTONIC
1da177e4
LT
222
223/*
57a55875 224 * The various flags for setting POSIX.1b interval timers:
1da177e4 225 */
1ad106ca 226#define TIMER_ABSTIME 0x01
1da177e4
LT
227
228#endif