[PATCH] list_is_last utility
[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
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 */
49static inline int timespec_compare(struct timespec *lhs, struct timespec *rhs)
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
58static inline int timeval_compare(struct timeval *lhs, struct timeval *rhs)
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
5f82b2b7
TG
73/*
74 * Returns true if the timespec is norm, false if denorm:
75 */
76#define timespec_valid(ts) \
bd3f8f2b 77 (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC))
5f82b2b7 78
1da177e4
LT
79extern struct timespec xtime;
80extern struct timespec wall_to_monotonic;
81extern seqlock_t xtime_lock;
82
ad596171 83void timekeeping_init(void);
84
1da177e4 85static inline unsigned long get_seconds(void)
57a55875 86{
1da177e4
LT
87 return xtime.tv_sec;
88}
89
90struct timespec current_kernel_time(void);
91
57a55875
IM
92#define CURRENT_TIME (current_kernel_time())
93#define CURRENT_TIME_SEC ((struct timespec) { xtime.tv_sec, 0 })
1da177e4
LT
94
95extern void do_gettimeofday(struct timeval *tv);
96extern int do_settimeofday(struct timespec *tv);
97extern int do_sys_settimeofday(struct timespec *tv, struct timezone *tz);
becf8b5d 98#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
5590ff0d 99extern long do_utimes(int dfd, char __user *filename, struct timeval *times);
1da177e4 100struct itimerval;
57a55875
IM
101extern int do_setitimer(int which, struct itimerval *value,
102 struct itimerval *ovalue);
c08b8a49 103extern unsigned int alarm_setitimer(unsigned int seconds);
1da177e4 104extern int do_getitimer(int which, struct itimerval *value);
57a55875 105extern void getnstimeofday(struct timespec *tv);
1da177e4
LT
106
107extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
cf3c769b 108extern int timekeeping_is_continuous(void);
1da177e4 109
f8f46da3
TG
110/**
111 * timespec_to_ns - Convert timespec to nanoseconds
112 * @ts: pointer to the timespec variable to be converted
113 *
114 * Returns the scalar nanosecond representation of the timespec
115 * parameter.
116 */
df869b63 117static inline s64 timespec_to_ns(const struct timespec *ts)
f8f46da3 118{
df869b63 119 return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
f8f46da3
TG
120}
121
122/**
123 * timeval_to_ns - Convert timeval to nanoseconds
124 * @ts: pointer to the timeval variable to be converted
125 *
126 * Returns the scalar nanosecond representation of the timeval
127 * parameter.
128 */
df869b63 129static inline s64 timeval_to_ns(const struct timeval *tv)
f8f46da3 130{
df869b63 131 return ((s64) tv->tv_sec * NSEC_PER_SEC) +
f8f46da3
TG
132 tv->tv_usec * NSEC_PER_USEC;
133}
134
135/**
136 * ns_to_timespec - Convert nanoseconds to timespec
137 * @nsec: the nanoseconds value to be converted
138 *
139 * Returns the timespec representation of the nsec parameter.
140 */
df869b63 141extern struct timespec ns_to_timespec(const s64 nsec);
f8f46da3
TG
142
143/**
144 * ns_to_timeval - Convert nanoseconds to timeval
145 * @nsec: the nanoseconds value to be converted
146 *
147 * Returns the timeval representation of the nsec parameter.
148 */
df869b63 149extern struct timeval ns_to_timeval(const s64 nsec);
f8f46da3 150
cf3c769b 151/**
152 * timespec_add_ns - Adds nanoseconds to a timespec
153 * @a: pointer to timespec to be incremented
154 * @ns: unsigned nanoseconds value to be added
155 */
156static inline void timespec_add_ns(struct timespec *a, u64 ns)
157{
158 ns += a->tv_nsec;
159 while(unlikely(ns >= NSEC_PER_SEC)) {
160 ns -= NSEC_PER_SEC;
161 a->tv_sec++;
162 }
163 a->tv_nsec = ns;
164}
1da177e4
LT
165#endif /* __KERNEL__ */
166
167#define NFDBITS __NFDBITS
168
169#define FD_SETSIZE __FD_SETSIZE
170#define FD_SET(fd,fdsetp) __FD_SET(fd,fdsetp)
171#define FD_CLR(fd,fdsetp) __FD_CLR(fd,fdsetp)
172#define FD_ISSET(fd,fdsetp) __FD_ISSET(fd,fdsetp)
173#define FD_ZERO(fdsetp) __FD_ZERO(fdsetp)
174
175/*
176 * Names of the interval timers, and structure
57a55875 177 * defining a timer setting:
1da177e4 178 */
57a55875
IM
179#define ITIMER_REAL 0
180#define ITIMER_VIRTUAL 1
181#define ITIMER_PROF 2
1da177e4 182
57a55875
IM
183struct itimerspec {
184 struct timespec it_interval; /* timer period */
185 struct timespec it_value; /* timer expiration */
1da177e4
LT
186};
187
57a55875
IM
188struct itimerval {
189 struct timeval it_interval; /* timer interval */
190 struct timeval it_value; /* current value */
1da177e4
LT
191};
192
1da177e4 193/*
57a55875 194 * The IDs of the various system clocks (for POSIX.1b interval timers):
1da177e4 195 */
1ad106ca
IM
196#define CLOCK_REALTIME 0
197#define CLOCK_MONOTONIC 1
198#define CLOCK_PROCESS_CPUTIME_ID 2
199#define CLOCK_THREAD_CPUTIME_ID 3
1da177e4
LT
200
201/*
57a55875 202 * The IDs of various hardware clocks:
1da177e4 203 */
1ad106ca
IM
204#define CLOCK_SGI_CYCLE 10
205#define MAX_CLOCKS 16
206#define CLOCKS_MASK (CLOCK_REALTIME | CLOCK_MONOTONIC)
207#define CLOCKS_MONO CLOCK_MONOTONIC
1da177e4
LT
208
209/*
57a55875 210 * The various flags for setting POSIX.1b interval timers:
1da177e4 211 */
1ad106ca 212#define TIMER_ABSTIME 0x01
1da177e4
LT
213
214#endif
This page took 0.248777 seconds and 5 git commands to generate.