diff options
Diffstat (limited to 'include/lldb/Core/Timer.h')
-rw-r--r-- | include/lldb/Core/Timer.h | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/include/lldb/Core/Timer.h b/include/lldb/Core/Timer.h new file mode 100644 index 0000000..e354d91 --- /dev/null +++ b/include/lldb/Core/Timer.h @@ -0,0 +1,160 @@ +//===-- Timer.h -------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_Timer_h_ +#define liblldb_Timer_h_ +#if defined(__cplusplus) + +#include <stdarg.h> +#include <stdio.h> +#include <string> +#include "lldb/lldb-private.h" +#include "lldb/Host/TimeValue.h" + +namespace lldb_private { + +//---------------------------------------------------------------------- +/// @class Timer Timer.h "lldb/Core/Timer.h" +/// @brief A timer class that simplifies common timing metrics. +/// +/// A scoped timer class that allows a variety of pthread mutex +/// objects to have a mutex locked when a Timer::Locker +/// object is created, and unlocked when it goes out of scope or +/// when the Timer::Locker::Reset(pthread_mutex_t *) +/// is called. This provides an exception safe way to lock a mutex +/// in a scope. +//---------------------------------------------------------------------- + +class Timer +{ +public: + static void + Initialize (); + + //-------------------------------------------------------------- + /// Default constructor. + //-------------------------------------------------------------- + Timer(const char *category, const char *format, ...) __attribute__ ((format (printf, 3, 4))); + + //-------------------------------------------------------------- + /// Desstructor + //-------------------------------------------------------------- + ~Timer(); + + void + Dump (); + + static void + SetDisplayDepth (uint32_t depth); + + static void + SetQuiet (bool value); + + static void + DumpCategoryTimes (Stream *s); + + static void + ResetCategoryTimes (); + +protected: + + void + ChildStarted (const TimeValue& time); + + void + ChildStopped (const TimeValue& time); + + uint64_t + GetTotalElapsedNanoSeconds(); + + uint64_t + GetTimerElapsedNanoSeconds(); + + //-------------------------------------------------------------- + /// Member variables + //-------------------------------------------------------------- + const char *m_category; + TimeValue m_total_start; + TimeValue m_timer_start; + uint64_t m_total_ticks; // Total running time for this timer including when other timers below this are running + uint64_t m_timer_ticks; // Ticks for this timer that do not include when other timers below this one are running + static uint32_t g_depth; + static uint32_t g_display_depth; + static FILE * g_file; +private: + Timer(); + DISALLOW_COPY_AND_ASSIGN (Timer); +}; + +class IntervalTimer +{ +public: + IntervalTimer() : + m_start (TimeValue::Now()) + { + } + + ~IntervalTimer() + { + } + + uint64_t + GetElapsedNanoSeconds() const + { + return TimeValue::Now() - m_start; + } + + void + Reset () + { + m_start = TimeValue::Now(); + } + + int + PrintfElapsed (const char *format, ...) __attribute__ ((format (printf, 2, 3))) + { + TimeValue now (TimeValue::Now()); + const uint64_t elapsed_nsec = now - m_start; + const char *unit = NULL; + float elapsed_value; + if (elapsed_nsec < 1000) + { + unit = "ns"; + elapsed_value = (float)elapsed_nsec; + } + else if (elapsed_nsec < 1000000) + { + unit = "us"; + elapsed_value = (float)elapsed_nsec/1000.0f; + } + else if (elapsed_nsec < 1000000000) + { + unit = "ms"; + elapsed_value = (float)elapsed_nsec/1000000.0f; + } + else + { + unit = "sec"; + elapsed_value = (float)elapsed_nsec/1000000000.0f; + } + int result = printf ("%3.2f %s: ", elapsed_value, unit); + va_list args; + va_start (args, format); + result += vprintf (format, args); + va_end (args); + return result; + } +protected: + TimeValue m_start; +}; + +} // namespace lldb_private + +#endif // #if defined(__cplusplus) +#endif // #ifndef liblldb_Timer_h_ |