blob: 1ae6a512c326d8e2073bc6907562366b09aebf2e [file] [log] [blame]
//===-- TimeValue.cpp -------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lldb/Host/TimeValue.h"
#include <stddef.h>
// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#define NSEC_PER_USEC 1000ull
#define USEC_PER_SEC 1000000ull
#define NSEC_PER_SEC 1000000000ull
using namespace lldb_private;
//----------------------------------------------------------------------
// TimeValue constructor
//----------------------------------------------------------------------
TimeValue::TimeValue() :
m_nano_seconds (0)
{
}
//----------------------------------------------------------------------
// TimeValue copy constructor
//----------------------------------------------------------------------
TimeValue::TimeValue(const TimeValue& rhs) :
m_nano_seconds (rhs.m_nano_seconds)
{
}
TimeValue::TimeValue(const struct timespec& ts) :
m_nano_seconds (ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec)
{
}
TimeValue::TimeValue(const struct timeval& tv) :
m_nano_seconds (tv.tv_sec * NSEC_PER_SEC + tv.tv_usec * NSEC_PER_USEC)
{
}
//----------------------------------------------------------------------
// Destructor
//----------------------------------------------------------------------
TimeValue::~TimeValue()
{
}
uint64_t
TimeValue::GetAsNanoSecondsSinceJan1_1970() const
{
return m_nano_seconds;
}
uint64_t
TimeValue::GetAsMicroSecondsSinceJan1_1970() const
{
return m_nano_seconds / NSEC_PER_USEC;
}
struct timespec
TimeValue::GetAsTimeSpec () const
{
struct timespec ts;
ts.tv_sec = m_nano_seconds / NSEC_PER_SEC;
ts.tv_nsec = m_nano_seconds % NSEC_PER_SEC;
return ts;
}
struct timeval
TimeValue::GetAsTimeVal () const
{
struct timeval tv;
tv.tv_sec = m_nano_seconds / NSEC_PER_SEC;
tv.tv_usec = (m_nano_seconds % NSEC_PER_SEC) / NSEC_PER_USEC;
return tv;
}
void
TimeValue::Clear ()
{
m_nano_seconds = 0;
}
bool
TimeValue::IsValid () const
{
return m_nano_seconds != 0;
}
void
TimeValue::OffsetWithSeconds (uint64_t sec)
{
m_nano_seconds += sec * NSEC_PER_SEC;
}
void
TimeValue::OffsetWithMicroSeconds (uint64_t usec)
{
m_nano_seconds += usec * NSEC_PER_USEC;
}
void
TimeValue::OffsetWithNanoSeconds (uint64_t nsec)
{
m_nano_seconds += nsec;
}
TimeValue
TimeValue::Now()
{
struct timeval tv;
gettimeofday(&tv, NULL);
TimeValue now(tv);
return now;
}
//----------------------------------------------------------------------
// TimeValue assignment operator
//----------------------------------------------------------------------
const TimeValue&
TimeValue::operator=(const TimeValue& rhs)
{
m_nano_seconds = rhs.m_nano_seconds;
return *this;
}
bool
lldb_private::operator == (const TimeValue &lhs, const TimeValue &rhs)
{
return lhs.GetAsNanoSecondsSinceJan1_1970() == rhs.GetAsNanoSecondsSinceJan1_1970();
}
bool
lldb_private::operator != (const TimeValue &lhs, const TimeValue &rhs)
{
return lhs.GetAsNanoSecondsSinceJan1_1970() != rhs.GetAsNanoSecondsSinceJan1_1970();
}
bool
lldb_private::operator < (const TimeValue &lhs, const TimeValue &rhs)
{
return lhs.GetAsNanoSecondsSinceJan1_1970() < rhs.GetAsNanoSecondsSinceJan1_1970();
}
bool
lldb_private::operator <= (const TimeValue &lhs, const TimeValue &rhs)
{
return lhs.GetAsNanoSecondsSinceJan1_1970() <= rhs.GetAsNanoSecondsSinceJan1_1970();
}
bool
lldb_private::operator > (const TimeValue &lhs, const TimeValue &rhs)
{
return lhs.GetAsNanoSecondsSinceJan1_1970() > rhs.GetAsNanoSecondsSinceJan1_1970();
}
bool
lldb_private::operator >= (const TimeValue &lhs, const TimeValue &rhs)
{
return lhs.GetAsNanoSecondsSinceJan1_1970() >= rhs.GetAsNanoSecondsSinceJan1_1970();
}
uint64_t
lldb_private::operator - (const TimeValue &lhs, const TimeValue &rhs)
{
return lhs.GetAsNanoSecondsSinceJan1_1970() - rhs.GetAsNanoSecondsSinceJan1_1970();
}