mirror of
https://github.com/opnsense/src.git
synced 2026-02-28 12:20:54 -05:00
(A number of files not required for the FreeBSD build have been removed.) Sponsored by: DARPA, AFRL
160 lines
4.1 KiB
C++
160 lines
4.1 KiB
C++
//===-- 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_
|