Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
linux
time.h
Go to the documentation of this file.
1
#ifndef _LINUX_TIME_H
2
#define _LINUX_TIME_H
3
4
# include <
linux/cache.h
>
5
# include <
linux/seqlock.h
>
6
# include <
linux/math64.h
>
7
#include <
uapi/linux/time.h
>
8
9
extern
struct
timezone
sys_tz
;
10
11
/* Parameters used to convert the timespec values: */
12
#define MSEC_PER_SEC 1000L
13
#define USEC_PER_MSEC 1000L
14
#define NSEC_PER_USEC 1000L
15
#define NSEC_PER_MSEC 1000000L
16
#define USEC_PER_SEC 1000000L
17
#define NSEC_PER_SEC 1000000000L
18
#define FSEC_PER_SEC 1000000000000000LL
19
20
#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
21
22
static
inline
int
timespec_equal(
const
struct
timespec
*
a
,
23
const
struct
timespec
*
b
)
24
{
25
return
(a->
tv_sec
== b->
tv_sec
) && (a->
tv_nsec
== b->
tv_nsec
);
26
}
27
28
/*
29
* lhs < rhs: return <0
30
* lhs == rhs: return 0
31
* lhs > rhs: return >0
32
*/
33
static
inline
int
timespec_compare(
const
struct
timespec
*lhs,
const
struct
timespec
*rhs)
34
{
35
if
(lhs->
tv_sec
< rhs->
tv_sec
)
36
return
-1;
37
if
(lhs->
tv_sec
> rhs->
tv_sec
)
38
return
1;
39
return
lhs->
tv_nsec
- rhs->
tv_nsec
;
40
}
41
42
static
inline
int
timeval_compare(
const
struct
timeval
*lhs,
const
struct
timeval
*rhs)
43
{
44
if
(lhs->
tv_sec
< rhs->
tv_sec
)
45
return
-1;
46
if
(lhs->
tv_sec
> rhs->
tv_sec
)
47
return
1;
48
return
lhs->
tv_usec
- rhs->
tv_usec
;
49
}
50
51
extern
unsigned
long
mktime
(
const
unsigned
int
year
,
const
unsigned
int
mon,
52
const
unsigned
int
day
,
const
unsigned
int
hour
,
53
const
unsigned
int
min
,
const
unsigned
int
sec
);
54
55
extern
void
set_normalized_timespec
(
struct
timespec
*
ts
,
time_t
sec
,
s64
nsec
);
56
57
/*
58
* timespec_add_safe assumes both values are positive and checks
59
* for overflow. It will return TIME_T_MAX if the reutrn would be
60
* smaller then either of the arguments.
61
*/
62
extern
struct
timespec
timespec_add_safe
(
const
struct
timespec
lhs,
63
const
struct
timespec
rhs);
64
65
66
static
inline
struct
timespec
timespec_add(
struct
timespec
lhs,
67
struct
timespec
rhs)
68
{
69
struct
timespec
ts_delta;
70
set_normalized_timespec
(&ts_delta, lhs.
tv_sec
+ rhs.
tv_sec
,
71
lhs.tv_nsec + rhs.tv_nsec);
72
return
ts_delta;
73
}
74
75
/*
76
* sub = lhs - rhs, in normalized form
77
*/
78
static
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
87
#define KTIME_MAX ((s64)~((u64)1 << 63))
88
#if (BITS_PER_LONG == 64)
89
# define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC)
90
#else
91
# define KTIME_SEC_MAX LONG_MAX
92
#endif
93
94
/*
95
* Returns true if the timespec is norm, false if denorm:
96
*/
97
static
inline
bool
timespec_valid(
const
struct
timespec
*
ts
)
98
{
99
/* Dates before 1970 are bogus */
100
if
(ts->
tv_sec
< 0)
101
return
false
;
102
/* Can't have more nanoseconds then a second */
103
if
((
unsigned
long
)ts->
tv_nsec
>=
NSEC_PER_SEC
)
104
return
false
;
105
return
true
;
106
}
107
108
static
inline
bool
timespec_valid_strict(
const
struct
timespec
*
ts
)
109
{
110
if
(!timespec_valid(ts))
111
return
false
;
112
/* Disallow values that could overflow ktime_t */
113
if
((
unsigned
long
long
)ts->
tv_sec
>=
KTIME_SEC_MAX
)
114
return
false
;
115
return
true
;
116
}
117
118
extern
void
read_persistent_clock
(
struct
timespec
*ts);
119
extern
void
read_boot_clock
(
struct
timespec
*ts);
120
extern
int
update_persistent_clock
(
struct
timespec
now);
121
void
timekeeping_init
(
void
);
122
extern
int
timekeeping_suspended
;
123
124
unsigned
long
get_seconds
(
void
);
125
struct
timespec
current_kernel_time
(
void
);
126
struct
timespec
__current_kernel_time
(
void
);
/* does not take xtime_lock */
127
struct
timespec
get_monotonic_coarse
(
void
);
128
void
get_xtime_and_monotonic_and_sleep_offset
(
struct
timespec
*xtim,
129
struct
timespec
*wtom,
struct
timespec
*sleep);
130
void
timekeeping_inject_sleeptime
(
struct
timespec
*
delta
);
131
132
#define CURRENT_TIME (current_kernel_time())
133
#define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 })
134
135
/* Some architectures do not supply their own clocksource.
136
* This is mainly the case in architectures that get their
137
* inter-tick times by reading the counter on their interval
138
* timer. Since these timers wrap every tick, they're not really
139
* useful as clocksources. Wrapping them to act like one is possible
140
* but not very efficient. So we provide a callout these arches
141
* can implement for use with the jiffies clocksource to provide
142
* finer then tick granular time.
143
*/
144
#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
145
extern
u32
arch_gettimeoffset
(
void
);
146
#else
147
static
inline
u32
arch_gettimeoffset
(
void
) {
return
0; }
148
#endif
149
150
extern
void
do_gettimeofday
(
struct
timeval
*tv);
151
extern
int
do_settimeofday
(
const
struct
timespec
*tv);
152
extern
int
do_sys_settimeofday
(
const
struct
timespec
*tv,
153
const
struct
timezone
*
tz
);
154
#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
155
extern
long
do_utimes
(
int
dfd,
const
char
__user *
filename
,
struct
timespec
*
times
,
int
flags
);
156
struct
itimerval
;
157
extern
int
do_setitimer
(
int
which,
struct
itimerval
*
value
,
158
struct
itimerval
*ovalue);
159
extern
unsigned
int
alarm_setitimer
(
unsigned
int
seconds
);
160
extern
int
do_getitimer
(
int
which,
struct
itimerval
*
value
);
161
extern
void
getnstimeofday
(
struct
timespec
*tv);
162
extern
void
getrawmonotonic
(
struct
timespec
*ts);
163
extern
void
getnstime_raw_and_real
(
struct
timespec
*ts_raw,
164
struct
timespec
*ts_real);
165
extern
void
getboottime
(
struct
timespec
*ts);
166
extern
void
monotonic_to_bootbased
(
struct
timespec
*ts);
167
extern
void
get_monotonic_boottime
(
struct
timespec
*ts);
168
169
extern
struct
timespec
timespec_trunc
(
struct
timespec
t
, unsigned gran);
170
extern
int
timekeeping_valid_for_hres
(
void
);
171
extern
u64
timekeeping_max_deferment
(
void
);
172
extern
int
timekeeping_inject_offset
(
struct
timespec
*ts);
173
174
struct
tms
;
175
extern
void
do_sys_times
(
struct
tms
*);
176
177
/*
178
* Similar to the struct tm in userspace <time.h>, but it needs to be here so
179
* that the kernel source is self contained.
180
*/
181
struct
tm
{
182
/*
183
* the number of seconds after the minute, normally in the range
184
* 0 to 59, but can be up to 60 to allow for leap seconds
185
*/
186
int
tm_sec
;
187
/* the number of minutes after the hour, in the range 0 to 59*/
188
int
tm_min
;
189
/* the number of hours past midnight, in the range 0 to 23 */
190
int
tm_hour
;
191
/* the day of the month, in the range 1 to 31 */
192
int
tm_mday
;
193
/* the number of months since January, in the range 0 to 11 */
194
int
tm_mon
;
195
/* the number of years since 1900 */
196
long
tm_year
;
197
/* the number of days since Sunday, in the range 0 to 6 */
198
int
tm_wday
;
199
/* the number of days since January 1, in the range 0 to 365 */
200
int
tm_yday
;
201
};
202
203
void
time_to_tm
(
time_t
totalsecs,
int
offset
,
struct
tm
*
result
);
204
212
static
inline
s64
timespec_to_ns(
const
struct
timespec
*ts)
213
{
214
return
((
s64
) ts->
tv_sec
*
NSEC_PER_SEC
) + ts->
tv_nsec
;
215
}
216
224
static
inline
s64
timeval_to_ns(
const
struct
timeval
*tv)
225
{
226
return
((
s64
) tv->
tv_sec
*
NSEC_PER_SEC
) +
227
tv->
tv_usec
*
NSEC_PER_USEC
;
228
}
229
236
extern
struct
timespec
ns_to_timespec
(
const
s64
nsec
);
237
244
extern
struct
timeval
ns_to_timeval
(
const
s64
nsec
);
245
254
static
__always_inline
void
timespec_add_ns(
struct
timespec
*
a
,
u64
ns
)
255
{
256
a->
tv_sec
+= __iter_div_u64_rem(a->
tv_nsec
+ ns,
NSEC_PER_SEC
, &ns);
257
a->
tv_nsec
=
ns
;
258
}
259
260
#endif
Generated on Thu Jan 10 2013 12:55:19 for Linux Kernel by
1.8.2