1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/* $NetBSD: timestamp.c,v 1.1.1.1 2008/12/22 00:18:13 haad Exp $ */
/*
* Copyright (C) 2006 Rackable Systems All rights reserved.
*
* This file is part of LVM2.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License v.2.1.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Abstract out the time methods used so they can be adjusted later -
* the results of these routines should stay in-core. This implementation
* requires librt.
*/
#include "lib.h"
#include <stdlib.h>
#include "timestamp.h"
/*
* The realtime section uses clock_gettime with the CLOCK_MONOTONIC
* parameter to prevent issues with time warps
*/
#ifdef HAVE_REALTIME
#include <time.h>
#include <bits/time.h>
struct timestamp {
struct timespec t;
};
struct timestamp *get_timestamp(void)
{
struct timestamp *ts = NULL;
if (!(ts = dm_malloc(sizeof(*ts))))
return_NULL;
if (clock_gettime(CLOCK_MONOTONIC, &ts->t)) {
log_sys_error("clock_gettime", "get_timestamp");
return NULL;
}
return ts;
}
/* cmp_timestamp: Compare two timestamps
*
* Return: -1 if t1 is less than t2
* 0 if t1 is equal to t2
* 1 if t1 is greater than t2
*/
int cmp_timestamp(struct timestamp *t1, struct timestamp *t2)
{
if(t1->t.tv_sec < t2->t.tv_sec)
return -1;
if(t1->t.tv_sec > t2->t.tv_sec)
return 1;
if(t1->t.tv_nsec < t2->t.tv_nsec)
return -1;
if(t1->t.tv_nsec > t2->t.tv_nsec)
return 1;
return 0;
}
#else /* ! HAVE_REALTIME */
/*
* The !realtime section just uses gettimeofday and is therefore subject
* to ntp-type time warps - not sure if should allow that.
*/
#include <sys/time.h>
struct timestamp {
struct timeval t;
};
struct timestamp *get_timestamp(void)
{
struct timestamp *ts = NULL;
if (!(ts = dm_malloc(sizeof(*ts))))
return_NULL;
if (gettimeofday(&ts->t, NULL)) {
log_sys_error("gettimeofday", "get_timestamp");
return NULL;
}
return ts;
}
/* cmp_timestamp: Compare two timestamps
*
* Return: -1 if t1 is less than t2
* 0 if t1 is equal to t2
* 1 if t1 is greater than t2
*/
int cmp_timestamp(struct timestamp *t1, struct timestamp *t2)
{
if(t1->t.tv_sec < t2->t.tv_sec)
return -1;
if(t1->t.tv_sec > t2->t.tv_sec)
return 1;
if(t1->t.tv_usec < t2->t.tv_usec)
return -1;
if(t1->t.tv_usec > t2->t.tv_usec)
return 1;
return 0;
}
#endif /* HAVE_REALTIME */
void destroy_timestamp(struct timestamp *t)
{
if (t)
dm_free(t);
}
|