Whamcloud - gitweb
3c46828c7590cd47343d75e41323571a7c378d48
[fs/lustre-release.git] / libcfs / include / libcfs / winnt / winnt-time.h
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 only,
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License version 2 for more details (a copy is included
16  * in the LICENSE file that accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License
19  * version 2 along with this program; If not, see
20  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
21  *
22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23  * CA 95054 USA or visit www.sun.com if you need additional information or
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright  2008 Sun Microsystems, Inc. All rights reserved
30  * Use is subject to license terms.
31  */
32 /*
33  * This file is part of Lustre, http://www.lustre.org/
34  * Lustre is a trademark of Sun Microsystems, Inc.
35  *
36  * libcfs/include/libcfs/winnt/winnt-time.h
37  *
38  * Implementation of portable time API for Winnt (kernel and user-level).
39  */
40
41 #ifndef __LIBCFS_WINNT_LINUX_TIME_H__
42 #define __LIBCFS_WINNT_LINUX_TIME_H__
43
44 #ifndef __LIBCFS_LIBCFS_H__
45 #error Do not #include this file directly. #include <libcfs/libcfs.h> instead
46 #endif
47
48 /* Portable time API */
49
50 /*
51  * Platform provides three opaque data-types:
52  *
53  *  cfs_time_t        represents point in time. This is internal kernel
54  *                    time rather than "wall clock". This time bears no
55  *                    relation to gettimeofday().
56  *
57  *  cfs_duration_t    represents time interval with resolution of internal
58  *                    platform clock
59  *
60  *  cfs_fs_time_t     represents instance in world-visible time. This is
61  *                    used in file-system time-stamps
62  *
63  *  cfs_time_t     cfs_time_current(void);
64  *  cfs_time_t     cfs_time_add    (cfs_time_t, cfs_duration_t);
65  *  cfs_duration_t cfs_time_sub    (cfs_time_t, cfs_time_t);
66  *  int            cfs_time_before (cfs_time_t, cfs_time_t);
67  *  int            cfs_time_beforeq(cfs_time_t, cfs_time_t);
68  *
69  *  cfs_duration_t cfs_duration_build(int64_t);
70  *
71  *  time_t         cfs_duration_sec (cfs_duration_t);
72  *  void           cfs_duration_usec(cfs_duration_t, struct timeval *);
73  *  void           cfs_duration_nsec(cfs_duration_t, struct timespec *);
74  *
75  *  void           cfs_fs_time_current(cfs_fs_time_t *);
76  *  time_t         cfs_fs_time_sec    (cfs_fs_time_t *);
77  *  void           cfs_fs_time_usec   (cfs_fs_time_t *, struct timeval *);
78  *  void           cfs_fs_time_nsec   (cfs_fs_time_t *, struct timespec *);
79  *  int            cfs_fs_time_before (cfs_fs_time_t *, cfs_fs_time_t *);
80  *  int            cfs_fs_time_beforeq(cfs_fs_time_t *, cfs_fs_time_t *);
81  *
82  *  CFS_TIME_FORMAT
83  *  CFS_DURATION_FORMAT
84  *
85  */
86
87 struct timeval {
88     time_t      tv_sec;   /* seconds */
89     suseconds_t tv_usec;  /* microseconds */
90 };
91
92 typedef time_t cfs_time_t;
93 typedef time_t cfs_duration_t;
94
95 #ifdef __KERNEL__
96
97 #include <libcfs/winnt/portals_compat25.h>
98
99 #define HZ (100)
100
101 struct timespec {
102     __u32   tv_sec;
103     __u32   tv_nsec;
104 };
105 typedef struct timeval cfs_fs_time_t;
106
107
108 #define ONE_BILLION ((u_int64_t)1000000000)
109 #define ONE_MILLION ((u_int64_t)   1000000)
110
111 /*
112  * Generic kernel stuff
113  */
114
115 #define jiffies     (ULONG_PTR)JIFFIES()
116 #define cfs_jiffies (ULONG_PTR)JIFFIES()
117
118 static inline void do_gettimeofday(struct timeval *tv)
119 {
120     LARGE_INTEGER Time;
121
122     KeQuerySystemTime(&Time);
123
124     tv->tv_sec  = (time_t) (Time.QuadPart / 10000000);
125     tv->tv_usec = (suseconds_t) (Time.QuadPart % 10000000) / 10;
126 }
127
128 static inline LONGLONG JIFFIES()
129 {
130     LARGE_INTEGER Tick;
131     LARGE_INTEGER Elapse;
132
133     KeQueryTickCount(&Tick);
134
135     Elapse.QuadPart  = Tick.QuadPart * KeQueryTimeIncrement();
136     Elapse.QuadPart /= (10000000 / HZ);
137
138     return Elapse.QuadPart;
139 }
140
141 static inline cfs_time_t cfs_time_current(void)
142 {
143     return (cfs_time_t)JIFFIES();
144 }
145
146 static inline time_t cfs_time_current_sec(void)
147 {
148     return (time_t)(JIFFIES() / HZ);
149 }
150
151 #define time_before(t1, t2) (((signed)(t1) - (signed)(t2)) < 0) 
152 #define time_before_eq(t1, t2) (((signed)(t1) - (signed)(t2)) <= 0) 
153
154 static inline void cfs_fs_time_current(cfs_fs_time_t *t)
155 {
156     ULONG         Linux;
157     LARGE_INTEGER Sys;
158
159     KeQuerySystemTime(&Sys);
160
161     RtlTimeToSecondsSince1970(&Sys, &Linux);
162
163     t->tv_sec  = Linux;
164     t->tv_usec = (Sys.LowPart % 10000000) / 10;
165 }
166
167 static inline unsigned long get_seconds(void)
168 {
169     cfs_fs_time_t t;
170     cfs_fs_time_current(&t);
171     return (unsigned long) t.tv_sec;
172 }
173
174 static inline cfs_time_t cfs_fs_time_sec(cfs_fs_time_t *t)
175 {
176     return (cfs_time_t)t->tv_sec;
177 }
178
179 static inline unsigned long __cfs_fs_time_flat(cfs_fs_time_t *t)
180 {
181     return (unsigned long)(t->tv_sec) * ONE_MILLION + t->tv_usec;
182 }
183
184 static inline int cfs_fs_time_before(cfs_fs_time_t *t1, cfs_fs_time_t *t2)
185 {
186     return (__cfs_fs_time_flat(t1) < __cfs_fs_time_flat(t2));
187 }
188
189 static inline int cfs_fs_time_beforeq(cfs_fs_time_t *t1, cfs_fs_time_t *t2)
190 {
191     return (__cfs_fs_time_flat(t1) <= __cfs_fs_time_flat(t2));
192 }
193
194 static inline cfs_duration_t cfs_time_seconds(cfs_duration_t seconds)
195 {
196     return  (cfs_duration_t)(seconds * HZ);
197 }
198
199 static inline time_t cfs_duration_sec(cfs_duration_t d)
200 {
201     return (time_t)(d / HZ);
202 }
203
204 static inline void cfs_duration_usec(cfs_duration_t d, struct timeval *s)
205 {
206     s->tv_sec = (__u32)(d / HZ);
207     s->tv_usec = (__u32)((d - (cfs_duration_t)s->tv_sec * HZ) *
208                               ONE_MILLION / HZ);
209 }
210
211 static inline void cfs_duration_nsec(cfs_duration_t d, struct timespec *s)
212 {
213     s->tv_sec = (__u32) (d / HZ);
214     s->tv_nsec = (__u32)((d - (cfs_duration_t)s->tv_sec * HZ) *
215                            ONE_BILLION / HZ);
216 }
217
218 static inline void cfs_fs_time_usec(cfs_fs_time_t *t, struct timeval *v)
219 {
220     *v = *t;
221 }
222
223 static inline void cfs_fs_time_nsec(cfs_fs_time_t *t, struct timespec *s)
224 {
225     s->tv_sec  = (__u32) t->tv_sec;
226     s->tv_nsec = (__u32) t->tv_usec * 1000;
227 }
228
229
230 #define cfs_time_current_64 JIFFIES
231
232 static inline __u64 cfs_time_add_64(__u64 t, __u64 d)
233 {
234     return t + d;
235 }
236
237 static inline __u64 cfs_time_shift_64(cfs_duration_t seconds)
238 {
239     return cfs_time_add_64(cfs_time_current_64(),
240                            cfs_time_seconds(seconds));
241 }
242
243 static inline int cfs_time_before_64(__u64 t1, __u64 t2)
244 {
245     return (__s64)t2 - (__s64)t1 > 0;
246 }
247
248 static inline int cfs_time_beforeq_64(__u64 t1, __u64 t2)
249 {
250     return (__s64)t2 - (__s64)t1 >= 0;
251 }
252
253 /*
254  * One jiffy
255  */
256 #define CFS_TICK                (1)
257 #define LTIME_S(t)                      *((__u64 *)&(t))
258
259 #define CFS_TIME_T              "%u"
260 #define CFS_DURATION_T          "%d"
261
262 #else   /* !__KERNEL__ */
263
264 #include <time.h>
265 #ifdef HAVE_LIBPTHREAD
266 #include <pthread.h>
267 #else
268 struct timespec {
269     unsigned long tv_sec;
270     unsigned long tv_nsec;
271 };
272 #endif /* HAVE_LIBPTHREAD */
273
274 #include "../user-time.h"
275
276 /* liblustre. time(2) based implementation. */
277 int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
278 void sleep(int time);
279 void do_gettimeofday(struct timeval *tv);
280 int gettimeofday(struct timeval *tv, void * tz);
281
282 #endif /* !__KERNEL__ */
283
284 /* __LIBCFS_LINUX_LINUX_TIME_H__ */
285 #endif
286 /*
287  * Local variables:
288  * c-indentation-style: "K&R"
289  * c-basic-offset: 8
290  * tab-width: 8
291  * fill-column: 80
292  * scroll-step: 1
293  * End:
294  */