forked from OSchip/llvm-project
158 lines
4.7 KiB
C++
158 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"
|
|
#include "lldb/Host/Config.h"
|
|
|
|
// C Includes
|
|
#include <cstring>
|
|
#include <stddef.h>
|
|
#include <time.h>
|
|
|
|
#ifdef _MSC_VER
|
|
#include "lldb/Host/windows/windows.h"
|
|
#endif
|
|
|
|
// C++ Includes
|
|
#include <chrono>
|
|
|
|
// 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, uint64_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() {
|
|
using namespace std::chrono;
|
|
auto now = system_clock::now();
|
|
auto ns_since_epoch =
|
|
duration_cast<std::chrono::nanoseconds>(now.time_since_epoch()).count();
|
|
|
|
return TimeValue(0, ns_since_epoch);
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// 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();
|
|
}
|