forked from OSchip/llvm-project
211 lines
4.7 KiB
C++
211 lines
4.7 KiB
C++
//===-- 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"
|
|
|
|
// C Includes
|
|
#include <stddef.h>
|
|
#include <time.h>
|
|
#include <cstring>
|
|
// C++ Includes
|
|
// Other libraries and framework includes
|
|
// Project includes
|
|
#include "lldb/Core/Stream.h"
|
|
|
|
|
|
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 * NanoSecPerSec + ts.tv_nsec)
|
|
{
|
|
}
|
|
|
|
TimeValue::TimeValue(const struct timeval& tv) :
|
|
m_nano_seconds (tv.tv_sec * NanoSecPerSec + tv.tv_usec * NanoSecPerMicroSec)
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// Destructor
|
|
//----------------------------------------------------------------------
|
|
TimeValue::~TimeValue()
|
|
{
|
|
}
|
|
|
|
|
|
uint64_t
|
|
TimeValue::GetAsNanoSecondsSinceJan1_1970() const
|
|
{
|
|
return m_nano_seconds;
|
|
}
|
|
|
|
uint64_t
|
|
TimeValue::GetAsMicroSecondsSinceJan1_1970() const
|
|
{
|
|
return m_nano_seconds / NanoSecPerMicroSec;
|
|
}
|
|
|
|
uint64_t
|
|
TimeValue::GetAsSecondsSinceJan1_1970() const
|
|
{
|
|
return m_nano_seconds / NanoSecPerSec;
|
|
}
|
|
|
|
|
|
|
|
struct timespec
|
|
TimeValue::GetAsTimeSpec () const
|
|
{
|
|
struct timespec ts;
|
|
ts.tv_sec = m_nano_seconds / NanoSecPerSec;
|
|
ts.tv_nsec = m_nano_seconds % NanoSecPerSec;
|
|
return ts;
|
|
}
|
|
|
|
struct timeval
|
|
TimeValue::GetAsTimeVal () const
|
|
{
|
|
struct timeval tv;
|
|
tv.tv_sec = m_nano_seconds / NanoSecPerSec;
|
|
tv.tv_usec = (m_nano_seconds % NanoSecPerSec) / NanoSecPerMicroSec;
|
|
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 * NanoSecPerSec;
|
|
}
|
|
|
|
void
|
|
TimeValue::OffsetWithMicroSeconds (uint64_t usec)
|
|
{
|
|
m_nano_seconds += usec * NanoSecPerMicroSec;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
void
|
|
TimeValue::Dump (Stream *s, uint32_t width) const
|
|
{
|
|
if (s == NULL)
|
|
return;
|
|
|
|
char time_buf[32];
|
|
time_t time = GetAsSecondsSinceJan1_1970();
|
|
char *time_cstr = ::ctime_r(&time, time_buf);
|
|
if (time_cstr)
|
|
{
|
|
char *newline = ::strpbrk(time_cstr, "\n\r");
|
|
if (newline)
|
|
*newline = '\0';
|
|
if (width > 0)
|
|
s->Printf("%-*s", width, time_cstr);
|
|
else
|
|
s->PutCString(time_cstr);
|
|
}
|
|
else if (width > 0)
|
|
s->Printf("%-*s", width, "");
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
|