summaryrefslogtreecommitdiffstats
path: root/src/VBox/NetworkServices/Dhcpd/TimeStamp.h
blob: 9f95bc47831fe1192906fffad172ef04e326d975 (plain)
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
/* $Id: TimeStamp.h $ */
/** @file
 * DHCP server - timestamps
 */

/*
 * Copyright (C) 2017-2019 Oracle Corporation
 *
 * This file is part of VirtualBox Open Source Edition (OSE), as
 * available from http://www.virtualbox.org. This file is free software;
 * you can redistribute it and/or modify it under the terms of the GNU
 * General Public License (GPL) as published by the Free Software
 * Foundation, in version 2 as it comes in the "COPYING" file of the
 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
 */

#ifndef VBOX_INCLUDED_SRC_Dhcpd_TimeStamp_h
#define VBOX_INCLUDED_SRC_Dhcpd_TimeStamp_h
#ifndef RT_WITHOUT_PRAGMA_ONCE
# pragma once
#endif

#include <iprt/string.h>
#include <iprt/time.h>


/*
 * Timestamp API uses unsigned time, but we need to be able to refer
 * to events in the past.  Hide the ugly convertions.
 */
class TimeStamp
{
    int64_t m_ns;

public:
    TimeStamp()
      : m_ns(0) {}

    TimeStamp(uint64_t ns)
      : m_ns(static_cast<int64_t>(ns)) {}

    static TimeStamp now()
    {
        return TimeStamp(RTTimeNanoTS());
    }

    static TimeStamp absSeconds(int64_t sec)
    {
        RTTIMESPEC delta;
        RTTimeNow(&delta);
        RTTimeSpecSubSeconds(&delta, sec);

        uint64_t stampNow = RTTimeNanoTS();
        return TimeStamp(stampNow - RTTimeSpecGetNano(&delta));
    }

    TimeStamp &addSeconds(int64_t sec)
    {
        m_ns += sec * RT_NS_1SEC;
        return *this;
    }

    TimeStamp &subSeconds(int64_t sec)
    {
        m_ns -= sec * RT_NS_1SEC;
        return *this;
    }


    RTTIMESPEC *getAbsTimeSpec(RTTIMESPEC *pTime) const
    {
        RTTimeNow(pTime);

        uint64_t stampNow = RTTimeNanoTS();
        uint64_t delta = stampNow - m_ns;
        RTTimeSpecSubNano(pTime, delta);
        return pTime;
    }

    int64_t getAbsSeconds() const
    {
        RTTIMESPEC time;
        return RTTimeSpecGetSeconds(getAbsTimeSpec(&time));
    }

    size_t absStrFormat(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput) const;

    friend bool operator<(const TimeStamp &l, const TimeStamp &r);
    friend bool operator>(const TimeStamp &l, const TimeStamp &r);
    friend bool operator<=(const TimeStamp &l, const TimeStamp &r);
    friend bool operator>=(const TimeStamp &l, const TimeStamp &r);
};


inline bool operator<(const TimeStamp &l, const TimeStamp &r) { return l.m_ns < r.m_ns; }
inline bool operator>(const TimeStamp &l, const TimeStamp &r) { return l.m_ns > r.m_ns; }
inline bool operator<=(const TimeStamp &l, const TimeStamp &r) { return l.m_ns <= r.m_ns; }
inline bool operator>=(const TimeStamp &l, const TimeStamp &r) { return l.m_ns >= r.m_ns; }

#endif /* !VBOX_INCLUDED_SRC_Dhcpd_TimeStamp_h */