dqn: Fix DQN_ASAN_POISON 0 breaking arenas, improve profiler API
This commit is contained in:
parent
04b5e26ff3
commit
b46b44f11c
@ -2,8 +2,8 @@
|
|||||||
#define DQN_ASAN_POISON 0
|
#define DQN_ASAN_POISON 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(DQN_ASAN_POISON_VET)
|
#if !defined(DQN_ASAN_VET_POISON)
|
||||||
#define DQN_ASAN_POISON_VET 0
|
#define DQN_ASAN_VET_POISON 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DQN_ASAN_POISON_ALIGNMENT 8
|
#define DQN_ASAN_POISON_ALIGNMENT 8
|
||||||
|
@ -952,9 +952,9 @@ DQN_API void Dqn_Library_DumpThreadContextArenaStat(Dqn_String8 file_path)
|
|||||||
|
|
||||||
#if !defined(DQN_NO_PROFILER)
|
#if !defined(DQN_NO_PROFILER)
|
||||||
// NOTE: [$PROF] Dqn_Profiler ======================================================================
|
// NOTE: [$PROF] Dqn_Profiler ======================================================================
|
||||||
Dqn_ProfilerZoneScope::Dqn_ProfilerZoneScope(uint16_t label)
|
Dqn_ProfilerZoneScope::Dqn_ProfilerZoneScope(Dqn_String8 name, uint16_t anchor_index)
|
||||||
{
|
{
|
||||||
zone = Dqn_Profiler_BeginZone(label);
|
zone = Dqn_Profiler_BeginZoneWithIndex(name, anchor_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
Dqn_ProfilerZoneScope::~Dqn_ProfilerZoneScope()
|
Dqn_ProfilerZoneScope::~Dqn_ProfilerZoneScope()
|
||||||
@ -962,15 +962,16 @@ Dqn_ProfilerZoneScope::~Dqn_ProfilerZoneScope()
|
|||||||
Dqn_Profiler_EndZone(zone);
|
Dqn_Profiler_EndZone(zone);
|
||||||
}
|
}
|
||||||
|
|
||||||
Dqn_ProfilerZone Dqn_Profiler_BeginZone(uint16_t label)
|
Dqn_ProfilerZone Dqn_Profiler_BeginZoneWithIndex(Dqn_String8 name, uint16_t anchor_index)
|
||||||
{
|
{
|
||||||
Dqn_ProfilerAnchor *anchor = Dqn_Profiler_AnchorBuffer(Dqn_ProfilerAnchorBuffer_Back) + label;
|
Dqn_ProfilerAnchor *anchor = Dqn_Profiler_AnchorBuffer(Dqn_ProfilerAnchorBuffer_Back) + anchor_index;
|
||||||
|
anchor->name = name;
|
||||||
Dqn_ProfilerZone result = {};
|
Dqn_ProfilerZone result = {};
|
||||||
result.begin_tsc = Dqn_CPU_TSC();
|
result.begin_tsc = Dqn_CPU_TSC();
|
||||||
result.label = label;
|
result.anchor_index = anchor_index;
|
||||||
result.parent_zone = g_dqn_library->profiler->parent_zone;
|
result.parent_zone = g_dqn_library->profiler->parent_zone;
|
||||||
result.elapsed_tsc_at_zone_start = anchor->tsc_inclusive;
|
result.elapsed_tsc_at_zone_start = anchor->tsc_inclusive;
|
||||||
g_dqn_library->profiler->parent_zone = label;
|
g_dqn_library->profiler->parent_zone = anchor_index;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -978,15 +979,15 @@ void Dqn_Profiler_EndZone(Dqn_ProfilerZone zone)
|
|||||||
{
|
{
|
||||||
uint64_t elapsed_tsc = Dqn_CPU_TSC() - zone.begin_tsc;
|
uint64_t elapsed_tsc = Dqn_CPU_TSC() - zone.begin_tsc;
|
||||||
Dqn_ProfilerAnchor *anchor_buffer = Dqn_Profiler_AnchorBuffer(Dqn_ProfilerAnchorBuffer_Back);
|
Dqn_ProfilerAnchor *anchor_buffer = Dqn_Profiler_AnchorBuffer(Dqn_ProfilerAnchorBuffer_Back);
|
||||||
Dqn_ProfilerAnchor *anchor = anchor_buffer + zone.label;
|
Dqn_ProfilerAnchor *anchor = anchor_buffer + zone.anchor_index;
|
||||||
|
|
||||||
anchor->hit_count++;
|
anchor->hit_count++;
|
||||||
anchor->tsc_inclusive = zone.elapsed_tsc_at_zone_start + elapsed_tsc;
|
anchor->tsc_inclusive = zone.elapsed_tsc_at_zone_start + elapsed_tsc;
|
||||||
anchor->tsc_exclusive += elapsed_tsc;
|
anchor->tsc_exclusive += elapsed_tsc;
|
||||||
|
|
||||||
Dqn_ProfilerAnchor *parent_anchor = anchor_buffer + zone.parent_zone;
|
Dqn_ProfilerAnchor *parent_anchor = anchor_buffer + zone.parent_zone;
|
||||||
parent_anchor->tsc_exclusive -= elapsed_tsc;
|
parent_anchor->tsc_exclusive -= elapsed_tsc;
|
||||||
g_dqn_library->profiler->parent_zone = zone.parent_zone;
|
g_dqn_library->profiler->parent_zone = zone.parent_zone;
|
||||||
}
|
}
|
||||||
|
|
||||||
Dqn_ProfilerAnchor *Dqn_Profiler_AnchorBuffer(Dqn_ProfilerAnchorBuffer buffer)
|
Dqn_ProfilerAnchor *Dqn_Profiler_AnchorBuffer(Dqn_ProfilerAnchorBuffer buffer)
|
||||||
@ -1003,4 +1004,31 @@ void Dqn_Profiler_SwapAnchorBuffer(uint32_t anchor_count)
|
|||||||
Dqn_ProfilerAnchor *anchors = Dqn_Profiler_AnchorBuffer(Dqn_ProfilerAnchorBuffer_Back);
|
Dqn_ProfilerAnchor *anchors = Dqn_Profiler_AnchorBuffer(Dqn_ProfilerAnchorBuffer_Back);
|
||||||
DQN_MEMSET(anchors, 0, anchor_count * sizeof(g_dqn_library->profiler->anchors[0][0]));
|
DQN_MEMSET(anchors, 0, anchor_count * sizeof(g_dqn_library->profiler->anchors[0][0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Dqn_Profiler_Dump(uint64_t tsc_per_second)
|
||||||
|
{
|
||||||
|
Dqn_ProfilerAnchor *anchors = Dqn_Profiler_AnchorBuffer(Dqn_ProfilerAnchorBuffer_Back);
|
||||||
|
for (size_t anchor_index = 1; anchor_index < DQN_PROFILER_ANCHOR_BUFFER_SIZE; anchor_index++) {
|
||||||
|
Dqn_ProfilerAnchor const *anchor = anchors + anchor_index;
|
||||||
|
if (!anchor->hit_count)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
uint64_t tsc_exclusive = anchor->tsc_exclusive;
|
||||||
|
uint64_t tsc_inclusive = anchor->tsc_inclusive;
|
||||||
|
Dqn_f64 tsc_exclusive_milliseconds = tsc_exclusive * 1000 / DQN_CAST(Dqn_f64)tsc_per_second;
|
||||||
|
if (tsc_exclusive == tsc_inclusive) {
|
||||||
|
Dqn_Print_LnF("%.*s[%u]: %.1fms",
|
||||||
|
DQN_STRING_FMT(anchor->name),
|
||||||
|
anchor->hit_count,
|
||||||
|
tsc_exclusive_milliseconds);
|
||||||
|
} else {
|
||||||
|
Dqn_f64 tsc_inclusive_milliseconds = tsc_inclusive * 1000 / DQN_CAST(Dqn_f64)tsc_per_second;
|
||||||
|
Dqn_Print_LnF("%.*s[%u]: %.1f/%.1fms",
|
||||||
|
DQN_STRING_FMT(anchor->name),
|
||||||
|
anchor->hit_count,
|
||||||
|
tsc_exclusive_milliseconds,
|
||||||
|
tsc_inclusive_milliseconds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif // !defined(DQN_NO_PROFILER)
|
#endif // !defined(DQN_NO_PROFILER)
|
||||||
|
@ -489,7 +489,7 @@ DQN_API Dqn_U64String Dqn_U64ToString (uint64_t val, char separator);
|
|||||||
for (size_t index = 0; index < Zone_Count; index++) {
|
for (size_t index = 0; index < Zone_Count; index++) {
|
||||||
Dqn_ProfilerAnchor *anchor = anchors + index;
|
Dqn_ProfilerAnchor *anchor = anchors + index;
|
||||||
printf("%.*s[%u] %zu cycles (%.1fms)\n",
|
printf("%.*s[%u] %zu cycles (%.1fms)\n",
|
||||||
DQN_STRING_FMT(anchor->label),
|
DQN_STRING_FMT(anchor->anchor_index),
|
||||||
anchor->hit_count,
|
anchor->hit_count,
|
||||||
anchor->tsc_inclusive,
|
anchor->tsc_inclusive,
|
||||||
anchor->tsc_inclusive * tsc_per_seconds * 1000.f);
|
anchor->tsc_inclusive * tsc_per_seconds * 1000.f);
|
||||||
@ -524,27 +524,29 @@ struct Dqn_ProfilerAnchor
|
|||||||
// time spent in children functions that we call that are also being
|
// time spent in children functions that we call that are also being
|
||||||
// profiled. If we recursively call into ourselves, the time we spent in
|
// profiled. If we recursively call into ourselves, the time we spent in
|
||||||
// our function is accumulated.
|
// our function is accumulated.
|
||||||
uint64_t tsc_inclusive;
|
uint64_t tsc_inclusive;
|
||||||
uint64_t tsc_exclusive;
|
uint64_t tsc_exclusive;
|
||||||
uint16_t hit_count;
|
uint16_t hit_count;
|
||||||
|
Dqn_String8 name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Dqn_ProfilerZone
|
struct Dqn_ProfilerZone
|
||||||
{
|
{
|
||||||
uint16_t label;
|
uint16_t anchor_index;
|
||||||
uint64_t begin_tsc;
|
uint64_t begin_tsc;
|
||||||
uint16_t parent_zone;
|
uint16_t parent_zone;
|
||||||
uint64_t elapsed_tsc_at_zone_start;
|
uint64_t elapsed_tsc_at_zone_start;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
struct Dqn_ProfilerZoneScope
|
struct Dqn_ProfilerZoneScope
|
||||||
{
|
{
|
||||||
Dqn_ProfilerZoneScope(uint16_t label);
|
Dqn_ProfilerZoneScope(Dqn_String8 name, uint16_t anchor_index);
|
||||||
~Dqn_ProfilerZoneScope();
|
~Dqn_ProfilerZoneScope();
|
||||||
Dqn_ProfilerZone zone;
|
Dqn_ProfilerZone zone;
|
||||||
};
|
};
|
||||||
#define Dqn_Profiler_ZoneScope(label) auto DQN_UNIQUE_NAME(profile_zone_##label_) = Dqn_ProfilerZoneScope(label)
|
#define Dqn_Profiler_ZoneScope(name) auto DQN_UNIQUE_NAME(profile_zone_) = Dqn_ProfilerZoneScope(DQN_STRING8(name), __COUNTER__ + 1)
|
||||||
|
#define Dqn_Profiler_ZoneScopeWithIndex(name, anchor_index) auto DQN_UNIQUE_NAME(profile_zone_) = Dqn_ProfilerZoneScope(DQN_STRING8(name), anchor_index)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum Dqn_ProfilerAnchorBuffer
|
enum Dqn_ProfilerAnchorBuffer
|
||||||
@ -560,10 +562,15 @@ struct Dqn_Profiler
|
|||||||
uint16_t parent_zone;
|
uint16_t parent_zone;
|
||||||
};
|
};
|
||||||
|
|
||||||
Dqn_ProfilerZone Dqn_Profiler_BeginZone (uint16_t label);
|
// NOTE: Macros ====================================================================================
|
||||||
void Dqn_Profiler_EndZone (Dqn_ProfilerZone zone);
|
#define Dqn_Profiler_BeginZone(name) Dqn_Profiler_BeginZoneWithIndex(DQN_STRING8(name), __COUNTER__ + 1)
|
||||||
Dqn_ProfilerAnchor *Dqn_Profiler_AnchorBuffer (Dqn_ProfilerAnchorBuffer buffer);
|
|
||||||
void Dqn_Profiler_SwapAnchorBuffer (uint32_t anchor_count);
|
// NOTE: API =======================================================================================
|
||||||
|
Dqn_ProfilerZone Dqn_Profiler_BeginZoneWithIndex(Dqn_String8 name, uint16_t anchor_index);
|
||||||
|
void Dqn_Profiler_EndZone (Dqn_ProfilerZone zone);
|
||||||
|
Dqn_ProfilerAnchor *Dqn_Profiler_AnchorBuffer (Dqn_ProfilerAnchorBuffer buffer);
|
||||||
|
void Dqn_Profiler_SwapAnchorBuffer (uint32_t anchor_count);
|
||||||
|
void Dqn_Profiler_Dump (uint64_t tsc_per_second);
|
||||||
#endif // !defined(DQN_NO_PROFILER)
|
#endif // !defined(DQN_NO_PROFILER)
|
||||||
|
|
||||||
// NOTE: [$DLIB] Dqn_Library =======================================================================
|
// NOTE: [$DLIB] Dqn_Library =======================================================================
|
||||||
|
@ -179,8 +179,8 @@ DQN_API Dqn_MemBlockSizeRequiredResult Dqn_MemBlock_SizeRequired(Dqn_MemBlock co
|
|||||||
Dqn_usize Dqn_MemBlock_MetadataSize()
|
Dqn_usize Dqn_MemBlock_MetadataSize()
|
||||||
{
|
{
|
||||||
Dqn_usize init_poison_page = DQN_ASAN_POISON ? DQN_ASAN_POISON_GUARD_SIZE : 0;
|
Dqn_usize init_poison_page = DQN_ASAN_POISON ? DQN_ASAN_POISON_GUARD_SIZE : 0;
|
||||||
Dqn_usize poison_alignment = DQN_ASAN_POISON ? DQN_ASAN_POISON_ALIGNMENT : 0;
|
Dqn_usize alignment = DQN_ASAN_POISON ? DQN_ASAN_POISON_ALIGNMENT : alignof(Dqn_MemBlock);
|
||||||
Dqn_usize result = Dqn_AlignUpPowerOfTwo(sizeof(Dqn_MemBlock), poison_alignment) + init_poison_page;
|
Dqn_usize result = Dqn_AlignUpPowerOfTwo(sizeof(Dqn_MemBlock), alignment) + init_poison_page;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user