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