hrtimer: speedup hrtimer_enqueue
[deliverable/linux.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
5b78cc9a
JE
39static inline int timespec_equal(const struct timespec *a,
40 const struct timespec *b)
57a55875 41{
1da177e4 42 return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
57a55875 43}
1da177e4 44
643a6545
AM
45/*
46 * lhs < rhs: return <0
47 * lhs == rhs: return 0
48 * lhs > rhs: return >0
49 */
77adbfbf 50static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
643a6545
AM
51{
52 if (lhs->tv_sec < rhs->tv_sec)
53 return -1;
54 if (lhs->tv_sec > rhs->tv_sec)
55 return 1;
56 return lhs->tv_nsec - rhs->tv_nsec;
57}
58
77adbfbf 59static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
643a6545
AM
60{
61 if (lhs->tv_sec < rhs->tv_sec)
62 return -1;
63 if (lhs->tv_sec > rhs->tv_sec)
64 return 1;
65 return lhs->tv_usec - rhs->tv_usec;
66}
67
f4818900
IM
68extern unsigned long mktime(const unsigned int year, const unsigned int mon,
69 const unsigned int day, const unsigned int hour,
70 const unsigned int min, const unsigned int sec);
71
72extern void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec);
1da177e4 73
ca74e92b
SN
74/*
75 * sub = lhs - rhs, in normalized form
76 */
77static inline struct timespec timespec_sub(struct timespec lhs,
78 struct timespec rhs)
79{
80 struct timespec ts_delta;
81 set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec,
82 lhs.tv_nsec - rhs.tv_nsec);
83 return ts_delta;
84}
85
5f82b2b7
TG
86/*
87 * Returns true if the timespec is norm, false if denorm:
88 */
89#define timespec_valid(ts) \
bd3f8f2b 90 (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
5f82b2b7 91
1da177e4
LT
92extern struct timespec xtime;
93extern struct timespec wall_to_monotonic;
5809f9d4 94extern seqlock_t xtime_lock __attribute__((weak));
1da177e4 95
411187fb 96extern unsigned long read_persistent_clock(void);
ad596171 97void timekeeping_init(void);
98
1da177e4 99static inline unsigned long get_seconds(void)
57a55875 100{
1da177e4
LT
101 return xtime.tv_sec;
102}
103
104struct timespec current_kernel_time(void);
105
57a55875
IM
106#define CURRENT_TIME (current_kernel_time())
107#define CURRENT_TIME_SEC ((struct timespec) { xtime.tv_sec, 0 })
1da177e4
LT
108
109extern void do_gettimeofday(struct timeval *tv);
110extern int do_settimeofday(struct timespec *tv);
111extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
becf8b5d 112#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
1c710c89 113extern long do_utimes(int dfd, char __user *filename, struct timespec *times, int flags);
1da177e4 114struct itimerval;
57a55875
IM
115extern int do_setitimer(int which, struct itimerval *value,
116 struct itimerval *ovalue);
c08b8a49 117extern unsigned int alarm_setitimer(unsigned int seconds);
1da177e4 118extern int do_getitimer(int which, struct itimerval *value);
57a55875 119extern void getnstimeofday(struct timespec *tv);
7c3f1a57
TJ
120extern void getboottime(struct timespec *ts);
121extern void monotonic_to_bootbased(struct timespec *ts);
1da177e4
LT
122
123extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
cf3c769b 124extern int timekeeping_is_continuous(void);
8524070b 125extern void update_wall_time(void);
1da177e4 126
f8f46da3
TG
127/**
128 * timespec_to_ns - Convert timespec to nanoseconds
129 * @ts: pointer to the timespec variable to be converted
130 *
131 * Returns the scalar nanosecond representation of the timespec
132 * parameter.
133 */
df869b63 134static inline s64 timespec_to_ns(const struct timespec *ts)
f8f46da3 135{
df869b63 136 return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
f8f46da3
TG
137}
138
139/**
140 * timeval_to_ns - Convert timeval to nanoseconds
141 * @ts: pointer to the timeval variable to be converted
142 *
143 * Returns the scalar nanosecond representation of the timeval
144 * parameter.
145 */
df869b63 146static inline s64 timeval_to_ns(const struct timeval *tv)
f8f46da3 147{
df869b63 148 return ((s64) tv->tv_sec * NSEC_PER_SEC) +
f8f46da3
TG
149 tv->tv_usec * NSEC_PER_USEC;
150}
151
152/**
153 * ns_to_timespec - Convert nanoseconds to timespec
154 * @nsec: the nanoseconds value to be converted
155 *
156 * Returns the timespec representation of the nsec parameter.
157 */
df869b63 158extern struct timespec ns_to_timespec(const s64 nsec);
f8f46da3
TG
159
160/**
161 * ns_to_timeval - Convert nanoseconds to timeval
162 * @nsec: the nanoseconds value to be converted
163 *
164 * Returns the timeval representation of the nsec parameter.
165 */
df869b63 166extern struct timeval ns_to_timeval(const s64 nsec);
f8f46da3 167
cf3c769b 168/**
169 * timespec_add_ns - Adds nanoseconds to a timespec
170 * @a: pointer to timespec to be incremented
171 * @ns: unsigned nanoseconds value to be added
172 */
173static inline void timespec_add_ns(struct timespec *a, u64 ns)
174{
175 ns += a->tv_nsec;
176 while(unlikely(ns >= NSEC_PER_SEC)) {
177 ns -= NSEC_PER_SEC;
178 a->tv_sec++;
179 }
180 a->tv_nsec = ns;
181}
1da177e4
LT
182#endif /* __KERNEL__ */
183
184#define NFDBITS __NFDBITS
185
186#define FD_SETSIZE __FD_SETSIZE
187#define FD_SET(fd,fdsetp) __FD_SET(fd,fdsetp)
188#define FD_CLR(fd,fdsetp) __FD_CLR(fd,fdsetp)
189#define FD_ISSET(fd,fdsetp) __FD_ISSET(fd,fdsetp)
190#define FD_ZERO(fdsetp) __FD_ZERO(fdsetp)
191
192/*
193 * Names of the interval timers, and structure
57a55875 194 * defining a timer setting:
1da177e4 195 */
57a55875
IM
196#define ITIMER_REAL 0
197#define ITIMER_VIRTUAL 1
198#define ITIMER_PROF 2
1da177e4 199
57a55875
IM
200struct itimerspec {
201 struct timespec it_interval; /* timer period */
202 struct timespec it_value; /* timer expiration */
1da177e4
LT
203};
204
57a55875
IM
205struct itimerval {
206 struct timeval it_interval; /* timer interval */
207 struct timeval it_value; /* current value */
1da177e4
LT
208};
209
1da177e4 210/*
57a55875 211 * The IDs of the various system clocks (for POSIX.1b interval timers):
1da177e4 212 */
1ad106ca
IM
213#define CLOCK_REALTIME 0
214#define CLOCK_MONOTONIC 1
215#define CLOCK_PROCESS_CPUTIME_ID 2
216#define CLOCK_THREAD_CPUTIME_ID 3
1da177e4
LT
217
218/*
57a55875 219 * The IDs of various hardware clocks:
1da177e4 220 */
1ad106ca
IM
221#define CLOCK_SGI_CYCLE 10
222#define MAX_CLOCKS 16
223#define CLOCKS_MASK (CLOCK_REALTIME | CLOCK_MONOTONIC)
224#define CLOCKS_MONO CLOCK_MONOTONIC
1da177e4
LT
225
226/*
57a55875 227 * The various flags for setting POSIX.1b interval timers:
1da177e4 228 */
1ad106ca 229#define TIMER_ABSTIME 0x01
1da177e4
LT
230
231#endif
This page took 0.372198 seconds and 5 git commands to generate.