Whamcloud - gitweb
f2533256a699f4732e3a111282f2c86f3e6967d9
[fs/lustre-release.git] / libcfs / include / libcfs / user-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 [sun.com URL with a
20  * copy of GPLv2].
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/user-time.h
37  *
38  * Implementation of portable time API for user-level.
39  *
40  * Author: Nikita Danilov <nikita@clusterfs.com>
41  */
42
43 #ifndef __LIBCFS_USER_TIME_H__
44 #define __LIBCFS_USER_TIME_H__
45
46 #ifndef __LIBCFS_LIBCFS_H__
47 #error Do not #include this file directly. #include <libcfs/libcfs.h> instead
48 #endif
49
50 /* Portable time API */
51
52 /*
53  * Platform provides three opaque data-types:
54  *
55  *  cfs_time_t        represents point in time. This is internal kernel
56  *                    time rather than "wall clock". This time bears no
57  *                    relation to gettimeofday().
58  *
59  *  cfs_duration_t    represents time interval with resolution of internal
60  *                    platform clock
61  *
62  *  cfs_fs_time_t     represents instance in world-visible time. This is
63  *                    used in file-system time-stamps
64  *
65  *  cfs_time_t     cfs_time_current(void);
66  *  cfs_time_t     cfs_time_add    (cfs_time_t, cfs_duration_t);
67  *  cfs_duration_t cfs_time_sub    (cfs_time_t, cfs_time_t);
68  *  int            cfs_time_before (cfs_time_t, cfs_time_t);
69  *  int            cfs_time_beforeq(cfs_time_t, cfs_time_t);
70  *
71  *  cfs_duration_t cfs_duration_build(int64_t);
72  *
73  *  time_t         cfs_duration_sec (cfs_duration_t);
74  *  void           cfs_duration_usec(cfs_duration_t, struct timeval *);
75  *  void           cfs_duration_nsec(cfs_duration_t, struct timespec *);
76  *
77  *  void           cfs_fs_time_current(cfs_fs_time_t *);
78  *  time_t         cfs_fs_time_sec    (cfs_fs_time_t *);
79  *  void           cfs_fs_time_usec   (cfs_fs_time_t *, struct timeval *);
80  *  void           cfs_fs_time_nsec   (cfs_fs_time_t *, struct timespec *);
81  *  int            cfs_fs_time_before (cfs_fs_time_t *, cfs_fs_time_t *);
82  *  int            cfs_fs_time_beforeq(cfs_fs_time_t *, cfs_fs_time_t *);
83  *
84  *  CFS_TIME_FORMAT
85  *  CFS_DURATION_FORMAT
86  *
87  */
88
89 #ifndef __KERNEL__
90
91 #define ONE_BILLION ((u_int64_t)1000000000)
92 #define ONE_MILLION 1000000
93
94 /*
95  * Liblustre. time(2) based implementation.
96  */
97
98 #include <sys/types.h>
99 #include <sys/time.h>
100 #include <time.h>
101
102 typedef time_t cfs_fs_time_t;
103 typedef time_t cfs_time_t;
104 typedef long cfs_duration_t;
105
106 static inline cfs_time_t cfs_time_current(void)
107 {
108         return time(NULL);
109 }
110
111 static inline cfs_duration_t cfs_time_seconds(int seconds)
112 {
113         return seconds;
114 }
115
116 static inline time_t cfs_time_current_sec(void)
117 {
118         return cfs_time_seconds(cfs_time_current());
119 }
120
121 static inline int cfs_time_before(cfs_time_t t1, cfs_time_t t2)
122 {
123         return t1 < t2;
124 }
125
126 static inline int cfs_time_beforeq(cfs_time_t t1, cfs_time_t t2)
127 {
128         return t1 <= t2;
129 }
130
131 static inline cfs_duration_t cfs_duration_build(int64_t nano)
132 {
133         return (cfs_duration_t) (nano / ONE_BILLION);
134 }
135
136 static inline time_t cfs_duration_sec(cfs_duration_t d)
137 {
138         return d;
139 }
140
141 static inline void cfs_duration_usec(cfs_duration_t d, struct timeval *s)
142 {
143         s->tv_sec = d;
144         s->tv_usec = 0;
145 }
146
147 static inline void cfs_duration_nsec(cfs_duration_t d, struct timespec *s)
148 {
149         s->tv_sec = d;
150         s->tv_nsec = 0;
151 }
152
153 static inline void cfs_fs_time_current(cfs_fs_time_t *t)
154 {
155         time(t);
156 }
157
158 static inline time_t cfs_fs_time_sec(cfs_fs_time_t *t)
159 {
160         return *t;
161 }
162
163 static inline void cfs_fs_time_usec(cfs_fs_time_t *t, struct timeval *v)
164 {
165         v->tv_sec = *t;
166         v->tv_usec = 0;
167 }
168
169 static inline void cfs_fs_time_nsec(cfs_fs_time_t *t, struct timespec *s)
170 {
171         s->tv_sec = *t;
172         s->tv_nsec = 0;
173 }
174
175 static inline int cfs_fs_time_before(cfs_fs_time_t *t1, cfs_fs_time_t *t2)
176 {
177         return *t1 < *t2;
178 }
179
180 static inline int cfs_fs_time_beforeq(cfs_fs_time_t *t1, cfs_fs_time_t *t2)
181 {
182         return *t1 <= *t2;
183 }
184
185 #define CFS_TICK                (1)
186
187 static inline cfs_time_t cfs_time_add(cfs_time_t t, cfs_duration_t d)
188 {
189         return t + d;
190 }
191
192 static inline cfs_duration_t cfs_time_sub(cfs_time_t t1, cfs_time_t t2)
193 {
194         return t1 - t2;
195 }
196
197 #define cfs_time_current_64 cfs_time_current
198 #define cfs_time_add_64     cfs_time_add
199 #define cfs_time_shift_64   cfs_time_shift
200 #define cfs_time_before_64  cfs_time_before
201 #define cfs_time_beforeq_64 cfs_time_beforeq
202
203 #ifndef CFS_TIME_T
204 #define CFS_TIME_T              "%u"
205 #endif
206
207 #define CFS_DURATION_T          "%ld"
208
209 /* !__KERNEL__ */
210 #endif
211
212 /* __LIBCFS_USER_TIME_H__ */
213 #endif
214 /*
215  * Local variables:
216  * c-indentation-style: "K&R"
217  * c-basic-offset: 8
218  * tab-width: 8
219  * fill-column: 80
220  * scroll-step: 1
221  * End:
222  */