Commit 0b7372f6 authored by Matthew Pickering's avatar Matthew Pickering Committed by Marge Bot

Add HEAP_PROF_SAMPLE_END event to mark end of samples

This allows a user to observe how long a sampling period lasts so that
the time taken can be removed from the profiling output.

Fixes #16697
parent e963beb5
Pipeline #6556 passed with stages
in 417 minutes and 18 seconds
......@@ -84,6 +84,14 @@ in length a single sample may need to be split among multiple
``EVENT_HEAP_PROF_SAMPLE`` events. The precise format of the census entries is
determined by the break-down type.
At the end of the sample period the ``EVENT_HEAP_PROF_SAMPLE_END`` event if
emitted. This is useful to properly delimit the sampling period and to record
the total time spent profiling.
* ``EVENT_HEAP_PROF_SAMPLE_END``
* ``Word64``: sample number
Cost-centre break-down
^^^^^^^^^^^^^^^^^^^^^^
......
......@@ -178,6 +178,7 @@
#define EVENT_HEAP_PROF_SAMPLE_BEGIN 162
#define EVENT_HEAP_PROF_SAMPLE_COST_CENTRE 163
#define EVENT_HEAP_PROF_SAMPLE_STRING 164
#define EVENT_HEAP_PROF_SAMPLE_END 165
#define EVENT_USER_BINARY_MSG 181
......
......@@ -884,6 +884,7 @@ dumpCensus( Census *census )
fprintf(hp_file, "\t%" FMT_Word "\n", (W_)count * sizeof(W_));
}
traceHeapProfSampleEnd(era);
printSample(false, census->time);
}
......
......@@ -623,6 +623,13 @@ void traceHeapProfSampleBegin(StgInt era)
}
}
void traceHeapProfSampleEnd(StgInt era)
{
if (eventlog_enabled) {
postHeapProfSampleEnd(era);
}
}
void traceHeapProfSampleString(StgWord8 profile_id,
const char *label, StgWord residency)
{
......
......@@ -288,6 +288,7 @@ void traceTaskDelete_ (Task *task);
void traceHeapProfBegin(StgWord8 profile_id);
void traceHeapProfSampleBegin(StgInt era);
void traceHeapProfSampleEnd(StgInt era);
void traceHeapProfSampleString(StgWord8 profile_id,
const char *label, StgWord residency);
#if defined(PROFILING)
......@@ -335,6 +336,7 @@ void flushTrace(void);
#define traceHeapProfBegin(profile_id) /* nothing */
#define traceHeapProfCostCentre(ccID, label, module, srcloc, is_caf) /* nothing */
#define traceHeapProfSampleBegin(era) /* nothing */
#define traceHeapProfSampleEnd(era) /* nothing */
#define traceHeapProfSampleCostCentre(profile_id, stack, residency) /* nothing */
#define traceHeapProfSampleString(profile_id, label, residency) /* nothing */
......
......@@ -103,6 +103,7 @@ char *EventDesc[] = {
[EVENT_HEAP_PROF_BEGIN] = "Start of heap profile",
[EVENT_HEAP_PROF_COST_CENTRE] = "Cost center definition",
[EVENT_HEAP_PROF_SAMPLE_BEGIN] = "Start of heap profile sample",
[EVENT_HEAP_PROF_SAMPLE_END] = "End of heap profile sample",
[EVENT_HEAP_PROF_SAMPLE_STRING] = "Heap profile string sample",
[EVENT_HEAP_PROF_SAMPLE_COST_CENTRE] = "Heap profile cost-centre sample",
[EVENT_USER_BINARY_MSG] = "User binary message"
......@@ -430,6 +431,10 @@ postHeaderEvents(void)
eventTypes[t].size = 8;
break;
case EVENT_HEAP_PROF_SAMPLE_END:
eventTypes[t].size = 8;
break;
case EVENT_HEAP_PROF_SAMPLE_STRING:
eventTypes[t].size = EVENT_SIZE_DYNAMIC;
break;
......@@ -1210,6 +1215,15 @@ void postHeapProfSampleBegin(StgInt era)
RELEASE_LOCK(&eventBufMutex);
}
void postHeapProfSampleEnd(StgInt era)
{
ACQUIRE_LOCK(&eventBufMutex);
ensureRoomForEvent(&eventBuf, EVENT_HEAP_PROF_SAMPLE_END);
postEventHeader(&eventBuf, EVENT_HEAP_PROF_SAMPLE_END);
postWord64(&eventBuf, era);
RELEASE_LOCK(&eventBufMutex);
}
void postHeapProfSampleString(StgWord8 profile_id,
const char *label,
StgWord64 residency)
......
......@@ -140,6 +140,7 @@ void postTaskDeleteEvent (EventTaskId taskId);
void postHeapProfBegin(StgWord8 profile_id);
void postHeapProfSampleBegin(StgInt era);
void postHeapProfSampleEnd(StgInt era);
void postHeapProfSampleString(StgWord8 profile_id,
const char *label,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment