Files
2026-08-08 13:54:26 -07:00

82 lines
2.2 KiB
C++

#pragma once
#include "idlib/containers/recoveredlist.h"
#include <cstdint>
#pragma pack(push, 4)
class idPLog {
public:
struct treeEntry_t {
const char* label;
int depth;
int numHits;
std::int64_t totalTicks;
int parent;
int firstChild;
int nextChild;
bool allocationOccured;
};
struct logEntry_t {
const char* label;
int parent;
std::int64_t totalTicks;
};
idPLog();
void Clear();
void EnsureEntries();
void SetGroupMask(std::uint64_t mask) { groupMask = mask; }
void EnableGroups(std::uint64_t mask) { groupMask |= mask; }
void DisableGroups(std::uint64_t mask) { groupMask &= ~mask; }
std::uint64_t GetGroupMask() const { return groupMask; }
bool IsGroupEnabled(std::uint64_t mask) const { return (groupMask & mask) != 0; }
std::int64_t GetOverHeadTicks();
void SubtractOverhead();
float BuildLogData(float thresholdMS = 0.0f,
std::int64_t adjustByTicks = 0);
void ShowUniqueEntries(float thresholdMS = 0.0f,
std::int64_t adjustByTicks = 0);
void ShowCallGraph(float thresholdMS = 0.0f,
std::int64_t adjustByTicks = 0);
int NumLogEntries() const { return logEntries.Num(); }
int NumTreeEntries() const { return treeEntries.Num(); }
const logEntry_t& GetLogEntry(int index) const { return logEntries[index]; }
private:
friend class idPLogScope;
idRecoveredList<treeEntry_t> treeEntries;
idRecoveredList<logEntry_t> logEntries;
int lastEntry;
int overHeadTicks;
std::uint64_t groupMask;
};
class idPLogScope {
public:
idPLogScope(idPLog& log, std::uint64_t groupMask, const char* label);
~idPLogScope();
void End(std::int64_t* totalTicks = nullptr);
private:
int logIndex;
idPLog* pLog;
};
#pragma pack(pop)
extern idPLog pLog;
#if INTPTR_MAX == INT32_MAX
static_assert(sizeof(idPLog::treeEntry_t) == 36,
"Recovered idPLog tree entry ABI changed");
static_assert(sizeof(idPLog::logEntry_t) == 16,
"Recovered idPLog log entry ABI changed");
static_assert(sizeof(idPLog) == 48, "Recovered idPLog ABI changed");
static_assert(sizeof(idPLogScope) == 8, "Recovered idPLogScope ABI changed");
#endif