Whamcloud - gitweb
Mass conversion of all copyright messages to Oracle.
[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
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 (c) 2008, 2010, Oracle and/or its affiliates. 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 typedef time_t cfs_fs_time_t;
99 typedef time_t cfs_time_t;
100 typedef time_t cfs_duration_t;
101
102 #define cfs_time_before(a, b) ((long)(a) - (long)(b) < 0)
103 #define cfs_time_beforeq(a, b) ((long)(b) - (long)(a) >= 0)
104
105 static inline cfs_time_t cfs_time_current(void)
106 {
107         return time(NULL);
108 }
109
110 static inline cfs_duration_t cfs_time_seconds(cfs_time_t seconds)
111 {
112         return seconds;
113 }
114
115 static inline time_t cfs_time_current_sec(void)
116 {
117         return cfs_time_seconds(cfs_time_current());
118 }
119
120 static inline cfs_duration_t cfs_duration_build(int64_t nano)
121 {
122         return (cfs_duration_t) (nano / ONE_BILLION);
123 }
124
125 static inline time_t cfs_duration_sec(cfs_duration_t d)
126 {
127         return d;
128 }
129
130 static inline void cfs_duration_usec(cfs_duration_t d, struct timeval *s)
131 {
132         s->tv_sec = d;
133         s->tv_usec = 0;
134 }
135
136 static inline void cfs_duration_nsec(cfs_duration_t d, struct timespec *s)
137 {
138         s->tv_sec = d;
139         s->tv_nsec = 0;
140 }
141
142 static inline void cfs_fs_time_current(cfs_fs_time_t *t)
143 {
144         time(t);
145 }
146
147 static inline time_t cfs_fs_time_sec(cfs_fs_time_t *t)
148 {
149         return *t;
150 }
151
152 static inline void cfs_fs_time_usec(cfs_fs_time_t *t, struct timeval *v)
153 {
154         v->tv_sec = *t;
155         v->tv_usec = 0;
156 }
157
158 static inline void cfs_fs_time_nsec(cfs_fs_time_t *t, struct timespec *s)
159 {
160         s->tv_sec = *t;
161         s->tv_nsec = 0;
162 }
163
164 static inline int cfs_fs_time_before(cfs_fs_time_t *t1, cfs_fs_time_t *t2)
165 {
166         return *t1 < *t2;
167 }
168
169 static inline int cfs_fs_time_beforeq(cfs_fs_time_t *t1, cfs_fs_time_t *t2)
170 {
171         return *t1 <= *t2;
172 }
173
174 #define CFS_TICK                (1)
175
176 #define cfs_time_current_64 cfs_time_current
177 #define cfs_time_add_64     cfs_time_add
178 #define cfs_time_shift_64   cfs_time_shift
179 #define cfs_time_before_64  cfs_time_before
180 #define cfs_time_beforeq_64 cfs_time_beforeq
181
182 /* XXX needs to move to arch specific header or configured */
183 #ifndef CFS_TIME_T
184 #define CFS_TIME_T              "%lu"
185 #endif
186
187 #define CFS_DURATION_T          "%ld"
188
189 /* !__KERNEL__ */
190 #endif
191
192 /* __LIBCFS_USER_TIME_H__ */
193 #endif
194 /*
195  * Local variables:
196  * c-indentation-style: "K&R"
197  * c-basic-offset: 8
198  * tab-width: 8
199  * fill-column: 80
200  * scroll-step: 1
201  * End:
202  */