forked from OSchip/llvm-project
223 lines
5.0 KiB
C++
223 lines
5.0 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"
|
|
#include "lldb/Host/Config.h"
|
|
|
|
// C Includes
|
|
#include <stddef.h>
|
|
#include <time.h>
|
|
#include <cstring>
|
|
|
|
#ifdef _MSC_VER
|
|
#include "lldb/Host/windows/windows.h"
|
|
#endif
|
|
|
|
// 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 ((uint64_t) ts.tv_sec * NanoSecPerSec + ts.tv_nsec)
|
|
{
|
|
}
|
|
|
|
TimeValue::TimeValue(uint32_t seconds, uint32_t nanos) :
|
|
m_nano_seconds((uint64_t) seconds * NanoSecPerSec + nanos)
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// 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;
|
|
}
|
|
|
|
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()
|
|
{
|
|
uint32_t seconds, nanoseconds;
|
|
#if _MSC_VER
|
|
SYSTEMTIME st;
|
|
GetSystemTime(&st);
|
|
nanoseconds = st.wMilliseconds * 1000000;
|
|
FILETIME ft;
|
|
SystemTimeToFileTime(&st, &ft);
|
|
|
|
seconds = ((((uint64_t)ft.dwHighDateTime) << 32 | ft.dwLowDateTime) / 10000000) - 11644473600ULL;
|
|
#else
|
|
struct timeval tv;
|
|
gettimeofday(&tv, NULL);
|
|
seconds = tv.tv_sec;
|
|
nanoseconds = tv.tv_usec * NanoSecPerMicroSec;
|
|
#endif
|
|
TimeValue now(seconds, nanoseconds);
|
|
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;
|
|
|
|
#ifndef LLDB_DISABLE_POSIX
|
|
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, "");
|
|
#endif
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
|