]>
Commit | Line | Data |
---|---|---|
1 | /*****************************************************************************\ | |
2 | * Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC. | |
3 | * Copyright (C) 2007 The Regents of the University of California. | |
4 | * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). | |
5 | * Written by Brian Behlendorf <behlendorf1@llnl.gov>. | |
6 | * UCRL-CODE-235197 | |
7 | * | |
8 | * This file is part of the SPL, Solaris Porting Layer. | |
9 | * For details, see <http://zfsonlinux.org/>. | |
10 | * | |
11 | * The SPL is free software; you can redistribute it and/or modify it | |
12 | * under the terms of the GNU General Public License as published by the | |
13 | * Free Software Foundation; either version 2 of the License, or (at your | |
14 | * option) any later version. | |
15 | * | |
16 | * The SPL is distributed in the hope that it will be useful, but WITHOUT | |
17 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
18 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
19 | * for more details. | |
20 | * | |
21 | * You should have received a copy of the GNU General Public License along | |
22 | * with the SPL. If not, see <http://www.gnu.org/licenses/>. | |
23 | \*****************************************************************************/ | |
24 | ||
25 | #ifndef _SPL_TIME_H | |
26 | #define _SPL_TIME_H | |
27 | ||
28 | #include <linux/module.h> | |
29 | #include <linux/time.h> | |
30 | #include <sys/types.h> | |
31 | #include <sys/timer.h> | |
32 | ||
33 | #if defined(CONFIG_64BIT) | |
34 | #define TIME_MAX INT64_MAX | |
35 | #define TIME_MIN INT64_MIN | |
36 | #else | |
37 | #define TIME_MAX INT32_MAX | |
38 | #define TIME_MIN INT32_MIN | |
39 | #endif | |
40 | ||
41 | #define SEC 1 | |
42 | #define MILLISEC 1000 | |
43 | #define MICROSEC 1000000 | |
44 | #define NANOSEC 1000000000 | |
45 | ||
46 | #define MSEC2NSEC(m) ((hrtime_t)(m) * (NANOSEC / MILLISEC)) | |
47 | #define NSEC2MSEC(n) ((n) / (NANOSEC / MILLISEC)) | |
48 | ||
49 | #define USEC2NSEC(m) ((hrtime_t)(m) * (NANOSEC / MICROSEC)) | |
50 | #define NSEC2USEC(n) ((n) / (NANOSEC / MICROSEC)) | |
51 | ||
52 | #define NSEC2SEC(n) ((n) / (NANOSEC / SEC)) | |
53 | #define SEC2NSEC(m) ((hrtime_t)(m) * (NANOSEC / SEC)) | |
54 | ||
55 | typedef longlong_t hrtime_t; | |
56 | typedef struct timespec timespec_t; | |
57 | ||
58 | static const int hz = HZ; | |
59 | ||
60 | #define TIMESPEC_OVERFLOW(ts) \ | |
61 | ((ts)->tv_sec < TIME_MIN || (ts)->tv_sec > TIME_MAX) | |
62 | ||
63 | #if defined(HAVE_INODE_TIMESPEC64_TIMES) | |
64 | typedef struct timespec64 inode_timespec_t; | |
65 | #else | |
66 | typedef struct timespec inode_timespec_t; | |
67 | #endif | |
68 | ||
69 | static inline void | |
70 | gethrestime(inode_timespec_t *ts) | |
71 | { | |
72 | #if defined(HAVE_INODE_TIMESPEC64_TIMES) | |
73 | *ts = current_kernel_time64(); | |
74 | #else | |
75 | *ts = current_kernel_time(); | |
76 | #endif | |
77 | } | |
78 | ||
79 | static inline time_t | |
80 | gethrestime_sec(void) | |
81 | { | |
82 | struct timespec ts; | |
83 | ts = current_kernel_time(); | |
84 | return (ts.tv_sec); | |
85 | } | |
86 | ||
87 | static inline hrtime_t | |
88 | gethrtime(void) | |
89 | { | |
90 | struct timespec ts; | |
91 | getrawmonotonic(&ts); | |
92 | return (((hrtime_t)ts.tv_sec * NSEC_PER_SEC) + ts.tv_nsec); | |
93 | } | |
94 | ||
95 | #endif /* _SPL_TIME_H */ |