Blame view
include/linux/time.h
7.77 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 |
#ifndef _LINUX_TIME_H #define _LINUX_TIME_H |
82644459c NTP: move the cmo... |
3 |
# include <linux/cache.h> |
57a558757 [PATCH] hrtimer: ... |
4 |
# include <linux/seqlock.h> |
f595ec964 common implementa... |
5 |
# include <linux/math64.h> |
361a3bf00 time64: Add time6... |
6 |
# include <linux/time64.h> |
1da177e4c Linux-2.6.12-rc2 |
7 |
|
b418da16d compat: generic c... |
8 |
extern struct timezone sys_tz; |
df0cc0539 select: add a tim... |
9 |
#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1) |
5b78cc9ac make timespec_equ... |
10 11 |
static inline int timespec_equal(const struct timespec *a, const struct timespec *b) |
57a558757 [PATCH] hrtimer: ... |
12 |
{ |
1da177e4c Linux-2.6.12-rc2 |
13 |
return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec); |
57a558757 [PATCH] hrtimer: ... |
14 |
} |
1da177e4c Linux-2.6.12-rc2 |
15 |
|
643a65454 [PATCH] select: f... |
16 17 18 19 20 |
/* * lhs < rhs: return <0 * lhs == rhs: return 0 * lhs > rhs: return >0 */ |
77adbfbf4 [PATCH] Add const... |
21 |
static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs) |
643a65454 [PATCH] select: f... |
22 23 24 25 26 27 28 |
{ if (lhs->tv_sec < rhs->tv_sec) return -1; if (lhs->tv_sec > rhs->tv_sec) return 1; return lhs->tv_nsec - rhs->tv_nsec; } |
77adbfbf4 [PATCH] Add const... |
29 |
static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs) |
643a65454 [PATCH] select: f... |
30 31 32 33 34 35 36 |
{ if (lhs->tv_sec < rhs->tv_sec) return -1; if (lhs->tv_sec > rhs->tv_sec) return 1; return lhs->tv_usec - rhs->tv_usec; } |
90b6ce9c4 time: Provide y20... |
37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
extern time64_t mktime64(const unsigned int year, const unsigned int mon, const unsigned int day, const unsigned int hour, const unsigned int min, const unsigned int sec); /** * Deprecated. Use mktime64(). */ static inline unsigned long mktime(const unsigned int year, const unsigned int mon, const unsigned int day, const unsigned int hour, const unsigned int min, const unsigned int sec) { return mktime64(year, mon, day, hour, min, sec); } |
f4818900f [PATCH] hrtimer: ... |
51 |
|
12e09337f time: Prevent 32 ... |
52 |
extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec); |
ce3bf7ab2 time: Implement t... |
53 54 55 56 57 58 |
/* * timespec_add_safe assumes both values are positive and checks * for overflow. It will return TIME_T_MAX if the reutrn would be * smaller then either of the arguments. */ |
df0cc0539 select: add a tim... |
59 60 |
extern struct timespec timespec_add_safe(const struct timespec lhs, const struct timespec rhs); |
1da177e4c Linux-2.6.12-rc2 |
61 |
|
ce3bf7ab2 time: Implement t... |
62 63 64 65 66 67 68 69 70 |
static inline struct timespec timespec_add(struct timespec lhs, struct timespec rhs) { struct timespec ts_delta; set_normalized_timespec(&ts_delta, lhs.tv_sec + rhs.tv_sec, lhs.tv_nsec + rhs.tv_nsec); return ts_delta; } |
5f82b2b77 [PATCH] hrtimer: ... |
71 |
/* |
ca74e92b4 [PATCH] per-task-... |
72 73 74 75 76 77 78 79 80 81 82 83 |
* sub = lhs - rhs, in normalized form */ static inline struct timespec timespec_sub(struct timespec lhs, struct timespec rhs) { struct timespec ts_delta; set_normalized_timespec(&ts_delta, lhs.tv_sec - rhs.tv_sec, lhs.tv_nsec - rhs.tv_nsec); return ts_delta; } /* |
5f82b2b77 [PATCH] hrtimer: ... |
84 85 |
* Returns true if the timespec is norm, false if denorm: */ |
4e8b14526 time: Improve san... |
86 87 88 89 90 91 92 93 |
static inline bool timespec_valid(const struct timespec *ts) { /* Dates before 1970 are bogus */ if (ts->tv_sec < 0) return false; /* Can't have more nanoseconds then a second */ if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) return false; |
cee58483c time: Move ktime_... |
94 95 96 97 98 99 100 |
return true; } static inline bool timespec_valid_strict(const struct timespec *ts) { if (!timespec_valid(ts)) return false; |
4e8b14526 time: Improve san... |
101 102 103 104 105 |
/* Disallow values that could overflow ktime_t */ if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX) return false; return true; } |
5f82b2b77 [PATCH] hrtimer: ... |
106 |
|
6ada1fc0e time: settimeofda... |
107 108 109 110 111 112 113 114 115 116 117 118 |
static inline bool timeval_valid(const struct timeval *tv) { /* Dates before 1970 are bogus */ if (tv->tv_sec < 0) return false; /* Can't have more microseconds then a second */ if (tv->tv_usec < 0 || tv->tv_usec >= USEC_PER_SEC) return false; return true; } |
8b094cd03 time: Consolidate... |
119 |
extern struct timespec timespec_trunc(struct timespec t, unsigned gran); |
1da177e4c Linux-2.6.12-rc2 |
120 |
|
37cf4dc33 time: Verify time... |
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
/* * Validates if a timespec/timeval used to inject a time offset is valid. * Offsets can be postive or negative. The value of the timeval/timespec * is the sum of its fields, but *NOTE*: the field tv_usec/tv_nsec must * always be non-negative. */ static inline bool timeval_inject_offset_valid(const struct timeval *tv) { /* We don't check the tv_sec as it can be positive or negative */ /* Can't have more microseconds then a second */ if (tv->tv_usec < 0 || tv->tv_usec >= USEC_PER_SEC) return false; return true; } static inline bool timespec_inject_offset_valid(const struct timespec *ts) { /* We don't check the tv_sec as it can be positive or negative */ /* Can't have more nanoseconds then a second */ if (ts->tv_nsec < 0 || ts->tv_nsec >= NSEC_PER_SEC) return false; return true; } |
57a558757 [PATCH] hrtimer: ... |
146 |
#define CURRENT_TIME (current_kernel_time()) |
2c6b47de1 Cleanup non-arch ... |
147 |
#define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 }) |
1da177e4c Linux-2.6.12-rc2 |
148 |
|
7d27558c4 timekeeping: crea... |
149 150 151 152 153 154 155 156 157 158 |
/* Some architectures do not supply their own clocksource. * This is mainly the case in architectures that get their * inter-tick times by reading the counter on their interval * timer. Since these timers wrap every tick, they're not really * useful as clocksources. Wrapping them to act like one is possible * but not very efficient. So we provide a callout these arches * can implement for use with the jiffies clocksource to provide * finer then tick granular time. */ #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET |
7b1f62076 time: convert arc... |
159 |
extern u32 (*arch_gettimeoffset)(void); |
7d27558c4 timekeeping: crea... |
160 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
161 |
struct itimerval; |
57a558757 [PATCH] hrtimer: ... |
162 163 |
extern int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue); |
1da177e4c Linux-2.6.12-rc2 |
164 |
extern int do_getitimer(int which, struct itimerval *value); |
1da177e4c Linux-2.6.12-rc2 |
165 |
|
8b094cd03 time: Consolidate... |
166 167 168 |
extern unsigned int alarm_setitimer(unsigned int seconds); extern long do_utimes(int dfd, const char __user *filename, struct timespec *times, int flags); |
1da177e4c Linux-2.6.12-rc2 |
169 |
|
f06febc96 timers: fix itime... |
170 171 |
struct tms; extern void do_sys_times(struct tms *); |
57f1f0874 time: add functio... |
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
/* * Similar to the struct tm in userspace <time.h>, but it needs to be here so * that the kernel source is self contained. */ struct tm { /* * the number of seconds after the minute, normally in the range * 0 to 59, but can be up to 60 to allow for leap seconds */ int tm_sec; /* the number of minutes after the hour, in the range 0 to 59*/ int tm_min; /* the number of hours past midnight, in the range 0 to 23 */ int tm_hour; /* the day of the month, in the range 1 to 31 */ int tm_mday; /* the number of months since January, in the range 0 to 11 */ int tm_mon; /* the number of years since 1900 */ long tm_year; /* the number of days since Sunday, in the range 0 to 6 */ int tm_wday; /* the number of days since January 1, in the range 0 to 365 */ int tm_yday; }; |
e6c2682a1 time: Add time64_... |
197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
void time64_to_tm(time64_t totalsecs, int offset, struct tm *result); /** * time_to_tm - converts the calendar time to local broken-down time * * @totalsecs the number of seconds elapsed since 00:00:00 on January 1, 1970, * Coordinated Universal Time (UTC). * @offset offset seconds adding to totalsecs. * @result pointer to struct tm variable to receive broken-down time */ static inline void time_to_tm(time_t totalsecs, int offset, struct tm *result) { time64_to_tm(totalsecs, offset, result); } |
57f1f0874 time: add functio... |
211 |
|
f8f46da3b [PATCH] hrtimer: ... |
212 213 214 215 216 217 218 |
/** * timespec_to_ns - Convert timespec to nanoseconds * @ts: pointer to the timespec variable to be converted * * Returns the scalar nanosecond representation of the timespec * parameter. */ |
df869b630 [PATCH] hrtimers:... |
219 |
static inline s64 timespec_to_ns(const struct timespec *ts) |
f8f46da3b [PATCH] hrtimer: ... |
220 |
{ |
df869b630 [PATCH] hrtimers:... |
221 |
return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec; |
f8f46da3b [PATCH] hrtimer: ... |
222 223 224 225 226 227 228 229 230 |
} /** * timeval_to_ns - Convert timeval to nanoseconds * @ts: pointer to the timeval variable to be converted * * Returns the scalar nanosecond representation of the timeval * parameter. */ |
df869b630 [PATCH] hrtimers:... |
231 |
static inline s64 timeval_to_ns(const struct timeval *tv) |
f8f46da3b [PATCH] hrtimer: ... |
232 |
{ |
df869b630 [PATCH] hrtimers:... |
233 |
return ((s64) tv->tv_sec * NSEC_PER_SEC) + |
f8f46da3b [PATCH] hrtimer: ... |
234 235 236 237 238 239 240 241 242 |
tv->tv_usec * NSEC_PER_USEC; } /** * ns_to_timespec - Convert nanoseconds to timespec * @nsec: the nanoseconds value to be converted * * Returns the timespec representation of the nsec parameter. */ |
df869b630 [PATCH] hrtimers:... |
243 |
extern struct timespec ns_to_timespec(const s64 nsec); |
f8f46da3b [PATCH] hrtimer: ... |
244 245 246 247 248 249 250 |
/** * ns_to_timeval - Convert nanoseconds to timeval * @nsec: the nanoseconds value to be converted * * Returns the timeval representation of the nsec parameter. */ |
df869b630 [PATCH] hrtimers:... |
251 |
extern struct timeval ns_to_timeval(const s64 nsec); |
f8f46da3b [PATCH] hrtimer: ... |
252 |
|
cf3c769b4 [PATCH] Time: Int... |
253 254 255 256 |
/** * timespec_add_ns - Adds nanoseconds to a timespec * @a: pointer to timespec to be incremented * @ns: unsigned nanoseconds value to be added |
9412e2864 always_inline tim... |
257 258 259 |
* * This must always be inlined because its used from the x86-64 vdso, * which cannot call other kernel functions. |
cf3c769b4 [PATCH] Time: Int... |
260 |
*/ |
9412e2864 always_inline tim... |
261 |
static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) |
cf3c769b4 [PATCH] Time: Int... |
262 |
{ |
9412e2864 always_inline tim... |
263 |
a->tv_sec += __iter_div_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns); |
cf3c769b4 [PATCH] Time: Int... |
264 265 |
a->tv_nsec = ns; } |
8b3d1cda4 posix_types: Remo... |
266 |
|
1da177e4c Linux-2.6.12-rc2 |
267 |
#endif |