2014-01-03 08:20:13 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <stddef.h>
|
2016-07-31 03:53:16 +00:00
|
|
|
#include <atomic>
|
2018-02-01 17:55:08 +00:00
|
|
|
#include <memory>
|
2014-01-03 08:20:13 +00:00
|
|
|
|
|
|
|
|
2016-10-24 02:02:37 +00:00
|
|
|
/** Implements global counters for various events happening in the application
|
|
|
|
* - for high level profiling.
|
|
|
|
* See .cpp for list of events.
|
2014-01-03 08:20:13 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
namespace ProfileEvents
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
/// Event identifier (index in array).
|
|
|
|
using Event = size_t;
|
|
|
|
using Count = size_t;
|
2018-02-01 17:55:08 +00:00
|
|
|
using Counter = std::atomic<Count>;
|
|
|
|
|
|
|
|
enum class Level
|
|
|
|
{
|
|
|
|
Global = 0,
|
|
|
|
User,
|
|
|
|
Process,
|
|
|
|
Thread
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Counters
|
|
|
|
{
|
|
|
|
Counter * counters = nullptr;
|
|
|
|
Counters * parent = nullptr;
|
2018-03-01 16:52:24 +00:00
|
|
|
Level level = Level::Thread;
|
2018-02-01 17:55:08 +00:00
|
|
|
std::unique_ptr<Counter[]> counters_holder;
|
|
|
|
|
|
|
|
Counters() = default;
|
|
|
|
|
|
|
|
Counters(Level level, Counters * parent = nullptr);
|
|
|
|
|
|
|
|
/// Global level static initializer
|
|
|
|
Counters(Counter * allocated_counters)
|
|
|
|
: counters(allocated_counters), parent(nullptr), level(Level::Global) {}
|
|
|
|
|
|
|
|
inline Counter & operator[] (Event event)
|
|
|
|
{
|
|
|
|
return counters[event];
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void increment(Event event, Count amount = 1)
|
|
|
|
{
|
|
|
|
Counters * current = this;
|
|
|
|
do
|
|
|
|
{
|
|
|
|
current->counters[event].fetch_add(amount, std::memory_order_relaxed);
|
|
|
|
current = current->parent;
|
|
|
|
} while (current != nullptr);
|
|
|
|
}
|
|
|
|
|
2018-03-01 16:52:24 +00:00
|
|
|
void getPartiallyAtomicSnapshot(Counters & res) const;
|
|
|
|
|
2018-02-01 17:55:08 +00:00
|
|
|
/// Reset metrics and parent
|
|
|
|
void reset();
|
|
|
|
|
|
|
|
/// Reset metrics
|
|
|
|
void resetCounters();
|
|
|
|
|
|
|
|
static const Event num_counters;
|
|
|
|
};
|
2014-01-03 08:20:13 +00:00
|
|
|
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
/// Counters - how many times each event happened.
|
2018-02-01 17:55:08 +00:00
|
|
|
extern Counters global_counters;
|
|
|
|
|
2014-01-03 08:20:13 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
/// Increment a counter for event. Thread-safe.
|
2018-02-01 17:55:08 +00:00
|
|
|
void increment(Event event, Count amount = 1);
|
|
|
|
|
|
|
|
/// Get text description of event by identifier. Returns statically allocated string.
|
|
|
|
const char * getDescription(Event event);
|
2014-01-03 08:20:13 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
/// Get index just after last event identifier.
|
|
|
|
Event end();
|
2016-10-24 02:02:37 +00:00
|
|
|
}
|