aboutsummaryrefslogtreecommitdiff
path: root/include/mach/time_value.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/mach/time_value.h')
-rw-r--r--include/mach/time_value.h27
1 files changed, 26 insertions, 1 deletions
diff --git a/include/mach/time_value.h b/include/mach/time_value.h
index f9b977c8..9ecdd28e 100644
--- a/include/mach/time_value.h
+++ b/include/mach/time_value.h
@@ -41,7 +41,8 @@ struct rpc_time_value {
typedef struct rpc_time_value rpc_time_value_t;
/*
- * Time value used by kernel.
+ * Time value used by kernel interfaces. Ideally they should be migrated
+ * to use time_value64 below.
*/
struct time_value {
long_integer_t seconds;
@@ -49,6 +50,16 @@ struct time_value {
};
typedef struct time_value time_value_t;
+/*
+ * Time value used internally by the kernel that uses 64 bits to track seconds
+ * and nanoseconds. Note that the current resolution is only microseconds.
+ */
+struct time_value64 {
+ int64_t seconds;
+ int64_t nanoseconds;
+};
+typedef struct time_value64 time_value64_t;
+
/**
* Functions used by Mig to perform user to kernel conversion and vice-versa.
* We only do this because we may run a 64 bit kernel with a 32 bit user space.
@@ -69,10 +80,14 @@ static __inline__ time_value_t convert_time_value_from_user(rpc_time_value_t tv)
* are normalized (microseconds <= 999999).
*/
#define TIME_MICROS_MAX (1000000)
+#define TIME_NANOS_MAX (1000000000)
#define time_value_assert(val) \
assert(0 <= (val)->microseconds && (val)->microseconds < TIME_MICROS_MAX);
+#define time_value64_assert(val) \
+ assert(0 <= (val)->nanoseconds && (val)->nanoseconds < TIME_NANOS_MAX);
+
#define time_value_add_usec(val, micros) { \
time_value_assert(val); \
if (((val)->microseconds += (micros)) \
@@ -83,6 +98,16 @@ static __inline__ time_value_t convert_time_value_from_user(rpc_time_value_t tv)
time_value_assert(val); \
}
+#define time_value64_add_usec(val, micros) { \
+ time_value64_assert(val); \
+ if (((val)->nanoseconds += (micros) * 1000) \
+ >= TIME_NANOS_MAX) { \
+ (val)->nanoseconds -= TIME_NANOS_MAX; \
+ (val)->seconds++; \
+ } \
+ time_value64_assert(val); \
+}
+
#define time_value_sub_usec(val, micros) { \
time_value_assert(val); \
if (((val)->microseconds -= (micros)) < 0) { \