blob: e354d91be44286f8c594e91daa704050067ae997 [file] [log] [blame]
//===-- 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_