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