//===-- 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 #include #include #ifdef _MSC_VER #include "lldb/Host/windows/windows.h" #endif // C++ Includes #include // 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(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(); }